簡單的抽象工廠 - 工廠不需要引數

場景:你需要在呼叫方法時解析依賴關係,而不是在建構函式中解析依賴關係。

解決方案:將抽象工廠注入建構函式。呼叫該方法時,它會從抽象工廠請求依賴項,而抽象工廠又會從容器中解析它。 (你的類取決於工廠,但從不呼叫容器本身。)

為你的工廠*宣告一個介面:

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)那麼它就是釋放方法。