简单的抽象工厂 - 工厂不需要参数

场景:你需要在调用方法时解析依赖关系,而不是在构造函数中解析依赖关系。

解决方案:将抽象工厂注入构造函数。调用该方法时,它会从抽象工厂请求依赖项,而抽象工厂又会从容器中解析它。 (你的类取决于工厂,但从不调用容器本身。)

为你的工厂*声明一个接口:

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