5
Autofac的文檔有一個有趣的頁面,描述了它自動生成delegate factories的能力。它也強烈地暗示,如果沒有Autofac,你可以通過手寫來得到類似的結果。如何實施委託工廠?
我正在使用Unity for IoC,並且希望避免將容器傳遞給需要創建其他對象的對象,那麼如何在不使用Autofac的情況下編寫委託工廠?
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