Я знаю, что это обсуждалось до тошноты ... но у меня проблема с тем, как Виндзор отслеживает временные объекты IDisposable.
Я понимаю преимущества предоставления Виндзору возможности управлять моими IDiposables ... но мне это не нравится.
Что произойдет, если я захочу обернуть свой компонент в блок using? Кодировщик предположит, что ресурс будет очищен в конце блока using, верно? Неправильно - будет вызываться Dispose, но Windsor будет удерживать экземпляр до явного освобождения. Для меня это все хорошо, поскольку я знаю, что делаю ... но как насчет другого разработчика, который кодирует класс и хочет использовать IDisposable так же, как обычно используется любой другой IDisposable - в блоке using?
using(factory.CreateInstance())
{
....
}
мне кажется намного яснее, чем:
MyDisposable instance;
try
{
instance = factory.GetInstance();
}
finally
{
factory.Release(instance);
}
Для того, чтобы по-настоящему избавиться от моих экземпляров и иметь их право на сборку мусора, мне нужно ссылаться на WindsorContainer или использовать типизированную фабрику, которая предоставляет метод выпуска. Это означает, что единственный приемлемый способ использования компонентов IDisposable - использовать типизированную фабрику. На мой взгляд, это нехорошо ... что, если кто-то добавит интерфейс IDisposable к существующему компоненту? Необходимо изменить все места, где ожидается ввод компонента. На мой взгляд, это действительно плохо. (Конечно, в сценарии без DI потребуется также изменить вызов Dispose ... но с Виндзором все места нужно будет изменить, чтобы использовать типизированную фабрику, что является гораздо большим изменением).
Хорошо, честно. достаточно, я могу использовать настраиваемую ReleasePolicy, верно? Как насчет этого?
public class CustomComponentsReleasePolicy : AllComponentsReleasePolicy
{
public override void Track(object instance, Burden burden)
{
if (burden.Model.LifestyleType == LifestyleType.Pooled)
base.Track(instance, burden);
}
}
Хорошо, отлично, мои компоненты IDisposable Transient теперь будут GC'd.
Что, если я захочу использовать TypedFactory, чтобы мой класс мог создавать много экземпляров типа?
public interface IMyFactory
{
MyDisposable GetInstance();
void Release(MyDisposable instance);
}
[Singleton]
public class TestClass
{
public TestClass(IMyFactory factory) { }
}
Хорошо, хорошо , например, вызов Release на заводе ничего не сделает для вызова Dispose () на MyDisposable, поскольку MyDisposable не отслеживается ....
Как я могу преодолеть эти трудности?
Спасибо.