Странный вопрос. Если вас беспокоит именно IDisposable
, большинство контейнеров будет проверять реализацию, и если она содержит реализацию IDisposable
, контейнер автоматически вызовет Dispose ()
, когда освободит экземпляр.
Итак,
// pure clean business interface. no dispose member
public interface ISomeBusinessInterface { }
// an implementation that does not require any 'disposing'
// and implements *only* business interface
public class SomeBusinessImplementation :
ISomeBusinessInterface
{
}
// an implementation that contains heavy resources and
// requires 'disposing'
public class SomeDisposableBusinessImplementation :
ISomeBusinessInterface,
IDisposable
{
}
// a typical consumer. no knowledge of instance life-cycle
public class SomeConsumer
{
// injector constructor
public SomeConsumer (ISomeBusinessInterface business) { }
}
Ваши потребители не должны знать о жизненном цикле впрыскиваемого компонента и не несут никакой ответственности за него. С этой точки зрения, имеет смысл, что ISomeBusinessInterface
не наследует и не подвергает никакому такому Dispose
методу - я имею в виду, подумайте, избавились ли вы от важного одноэлементного сервиса! Насколько это было бы неловко?
Так кто же ответственен за жизненный цикл впрыскиваемых компонентов? Ну контейнер это конечно! Как упоминалось ранее, большинство контейнеров будут проверять реализации компонентов на предмет реализаций IDisposable
[также еще одна причина использовать стандартные интерфейсы, определенные CLR], и будут вызывать Dispose
, когда он определит, что компонент достиг конца своего срока службы. Так что SomeDisposableBusinessImplementation
будет правильно утилизирован в конце. :)
Замок Виндзор
Контейнер Castle Windsor IoC отслеживает и поддерживает ссылки на все экземпляры, которые он создает. Он использует отражение, чтобы определить, является ли экземпляр «одноразовым» или нет, и затем вызывает Dispose ()
, когда жизненный цикл экземпляра завершается. Для долгоживущих объектов это когда контейнер утилизируется. Для кратковременных кратковременных объектов это когда Release (object)
явно вызывается потребителем *.
* = что поднимает важный вопрос, временные объекты должны быть получены с помощью явного вызова Resolve<T> ()
и освобождены с помощью явного вызова Release (object)
. Неявное внедрение временных классов может привести к утечкам памяти!
StructureMap
Контейнер IoC StructureMap не отслеживает и не поддерживает ссылки на временные экземпляры. Что в значительной степени означает, что управление жизненным циклом объекта немного сложнее. Это отлично подходит для кратковременных кратковременных объектов, так как не требуется дополнительного бухгалтерского учета , за исключением обычного . Однако для долгоживущих объектов вам придется расширить структуру, отразить и утилизировать экземпляры самостоятельно .
+ = сложный имо.