2009-11-20 125 views
5

Autofac的文檔有一個有趣的頁面,描述了它自動生成delegate factories的能力。它也強烈地暗示,如果沒有Autofac,你可以通過手寫來得到類似的結果。如何實施委託工廠?

我正在使用Unity for IoC,並且希望避免將容器傳遞給需要創建其他對象的對象,那麼如何在不使用Autofac的情況下編寫委託工廠?

回答

6

嗯,我從來沒有用過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); 

現在等你注入其他組件只是「供應商'而不是容器。

+0

這讓我開始了 - 非常感謝! – GraemeF 2009-11-23 16:24:40