Castle Windsor Transient Disposables

Я знаю, что это обсуждалось до тошноты ... но у меня проблема с тем, как Виндзор отслеживает временные объекты 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 не отслеживается ....

Как я могу преодолеть эти трудности?

Спасибо.

12
задан Jeff 22 July 2011 в 01:51
поделиться