如何实施委托工厂?
问题描述:
Autofac的文档有一个有趣的页面,描述了它自动生成delegate factories的能力。它也强烈地暗示,如果没有Autofac,你可以通过手写来得到类似的结果。如何实施委托工厂?
我正在使用Unity for IoC,并且希望避免将容器传递给需要创建其他对象的对象,那么如何在不使用Autofac的情况下编写委托工厂?
答
嗯,我从来没有用过Unity,所以我的回答很模糊。
校长很简单。您可以定义一些代表工厂的代表。然后你创建一个“工厂”级别,它具有与代表匹配的公共方法。这个班级知道容器。现在您注册委托并将该类设置为实现。然后你可以只注入委托。调用注入的委托时,会调用工厂类,该工厂类知道容器并向容器请求新实例。
首先你定义你的工厂代表。
public delegate TServiceType Provider<TServiceType>();
public delegate TServiceType Provider<TArg,TServiceType>(TArg argument);
将创建一个通用工厂:
/// <summary>
/// Represents a <see cref="Provider{TArg,TServiceType}"/> which holds
/// the container context and resolves the service on the <see cref="Create"/>-call
/// </summary>
internal class GenericFactory{
private readonly IContainer container;
public ClosureActivator(IContainer container)
{
this.container= container;
}
/// <summary>
/// Represents <see cref="Provider{TServiceType}.Invoke"/>
/// </summary>
public TService Create()
{
return container.Resolve<TService>();
}
/// <summary>
/// Represents <see cref="Provider{TArg,TServiceType}.Invoke"/>
/// </summary>
public TService Create(TArg arg)
{
return container.Resolve<TService>(new[] {new TypedParameter(typeof (TArg),arg)});
}
}
现在你注册什么的委托,像这样:
var newServiceCreater = new GenericFactory(container);
container.Register<Provider<MyCompoent>>().To(newServiceCreater.Create);
var newServiceCreater = new GenericFactory(container);
container
.Register<Provider<OtherServiceWithOneArgumentToConstruct>>()
.To(newServiceCreater.Create);
现在等你注入其他组件只是“供应商'而不是容器。
这让我开始了 - 非常感谢! – GraemeF 2009-11-23 16:24:40