简单的抽象工厂 - 工厂不需要参数
场景:你需要在调用方法时解析依赖关系,而不是在构造函数中解析依赖关系。
解决方案:将抽象工厂注入构造函数。调用该方法时,它会从抽象工厂请求依赖项,而抽象工厂又会从容器中解析它。 (你的类取决于工厂,但从不调用容器本身。)
为你的工厂*声明一个接口:
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
)那么它就是释放方法。