簡單的抽象工廠 - 工廠不需要引數
場景:你需要在呼叫方法時解析依賴關係,而不是在建構函式中解析依賴關係。
解決方案:將抽象工廠注入建構函式。呼叫該方法時,它會從抽象工廠請求依賴項,而抽象工廠又會從容器中解析它。 (你的類取決於工廠,但從不呼叫容器本身。)
為你的工廠*宣告一個介面:
public interface IFooFactory
{
IFoo CreateFoo();
void Release(IFoo foo);
}
將 TypedFactoryFacility
新增到你的容器中:
container.AddFacility<TypedFactoryFacility>();
指示容器使用 TypedFactoryFacility
來解決對 IFooFactory
的依賴關係:
container.Register(
Component.For<IFooFactory>().AsFactory(),
Component.For<IFoo, MyFooImplementation>());
你無需建立工廠例項。溫莎這樣做。
你現在可以將工廠注入類中並像這樣使用它:
public class NeedsFooFactory
{
private readonly IFooFactory _fooFactory;
public NeedsFooFactory(IFooFactory fooFactory)
{
_fooFactory = fooFactory;
}
public void MethodThatNeedsFoo()
{
var foo = _fooFactory.CreateFoo();
foo.DoWhatAFooDoes();
_fooFactory.Release(foo);
}
}
呼叫 Release
方法會導致容器釋放它解析的元件。否則它將不會被釋放,直到 _fooFactory
被釋放(每當 NeedsFooFactory
被釋放時)。
* Windsor 推斷哪種方法是建立方法,哪種方法是釋出方法。如果方法返回某些內容,則假定容器必須解析它。如果一個方法什麼都不返回(void
)那麼它就是釋放方法。