Мы используем типизированные фабрики Castle Windsor в нашем приложении и обнаруживаем, что, хотя они «скрывают» контейнер IoC от приложения, некоторая часть абстракции, безусловно, просачивается.То есть фабрики должны реализовать метод деблокирования, чтобы разрешенные экземпляры можно было безопасно утилизировать или иным образом списать.В конце концов, вы никогда не знаете, когда будет введено что-то из «бремени» компонента, то есть нисходящие зависимости, которые могут потребовать новой семантики.Следовательно, вы всегда предполагаете (в действительности), что все, что вы возвращаете из типизированной фабрики, это IDisposable
, то есть вы должны отслеживать это и возвращать.По этой причине нам нравится возвращать IReference<T>
объекты, чей метод Dispose
возвращает их фабрике для обеспечения такого поведения, а не в зависимости от любезности незнакомцев вызывать этот метод выпуска.
ОднакоЕсть много случаев, когда мы очень уверены, что типу сервиса не потребуется эта семантика.И мы знаем, что Виндзорский замок даже не потрудится отследить действительно переходные объекты без нагрузки вниз по течению.Сборщик мусора подойдет.В этом случае мы были бы счастливы с фабрикой, у которой не было метода возврата.Пользователи могут просто позволить сборке мусора делать свое дело.
Что мы хотели бы сделать, это проверить регистрации ядра и типизированных средств фабрики после того, как все типизированные фабрики были зарегистрированы, чтобы увидеть, были ли выполнены эти предположениянарушались.То есть, выдайте предупреждение для любого типизированного фабричного метода, который возвратил тип, который не имел семантики IDisposable
, но в итоге был зарегистрирован с бременем, которое имело.(Может потребоваться настроить это; например, в зависимости от синглтона всего приложения или объектов под запрос может быть приемлемым).
Какие общедоступные интерфейсы лучше всего использовать для запуска запросов и / или принудительного примененияэти условности?Или, может быть, мы просто прекратим использовать так много типизированных фабрик?