Я знаю, что это обсуждалось ad nauseum... но у меня есть проблема с тем, как Windsor отслеживает объекты Transient IDisposable.
Я понимаю преимущества, позволяющие Windsor управлять моими IDiposables... но мне это не нравится.
Что произойдет, если я захочу обернуть мой компонент в блок использования? Кодер сделал бы предположение, что ресурс будет очищен в конце используемого блока, верно? Неправильно - Dispose будет вызываться, но Windsor будет удерживать экземпляр, пока он не будет явно выпущен. Для меня все хорошо и хорошо, так как я знаю, что я делаю... но как насчет другого разработчика, который кодирует класс и хочет использовать IDisposable, как обычно используется любой другой IDisposable - в блоке использования?
using(factory.CreateInstance())
{
....
}
выглядит намного понятнее, чем:
MyDisposable instance;
try
{
instance = factory.GetInstance();
}
finally
{
factory.Release(instance);
}
Чтобы действительно удалить мои экземпляры и предоставить им право на GC, мне нужно обратиться к WindsorContainer или использовать типизированный factory, который предоставляет метод выпуска. Это означает, что единственным приемлемым способом использования IDisposable-компонентов является использование типизированного factory. Это нехорошо, на мой взгляд... что, если кто-то добавит интерфейс IDisposable к существующему компоненту? Каждое место, которое ожидает, что компонент будет введен, будет необходимо изменить. Это очень плохо, на мой взгляд. (Разумеется, в сценарии без DI, ему нужно будет также изменить вызов Dispose... но с Windsor каждое место нужно будет изменить, чтобы использовать напечатанный factory, что намного больше изменилось).
Хорошо, честно говоря, я могу использовать пользовательскую версию 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 на factory ничего не сделает для вызова Dispose() в MyDisposable, поскольку MyDisposable не отслеживается....
Как я могу преодолеть эти трудности?
Спасибо.