2009-11-20 5 views
5

Autofacのドキュメントは自動的にdelegate factoriesを生成する能力を記述する面白いページがあります。また、Autofacなしで手書きで同様の結果を得ることができることを強く示唆しています。どのように私は、デリゲートの工場を実装していますか?

私はIoCのためにユニティを使用していますし、他のオブジェクトを作成する必要があるオブジェクトに周りのコンテナを渡す避けたいので、どのようにAutofacせずに、デリゲートの工場を書くでしょうか?

答えて

6

私の答えはかなりあいまいですので、まあ、私は、これまでユニティを使用したことがありません。

校長は簡単です。ファクトリを表すデリゲートを定義します。次に、代理人に一致するパブリックメソッドを持つ 'factory'-classを作成します。このクラスはコンテナを認識します。今度はデリゲートを登録し、そのクラスを実装として設定します。次に、代理人だけを注入することができます。注入されたデリゲートを呼び出すと、ファクトリクラスが呼び出されます。ファクトリクラスはコンテナを認識し、コンテナに新しいインスタンスを要求します。

まず、ファクトリデリゲートを定義します。このようにあなたは、デリゲートを登録するものを今

/// <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)}); 
    } 
} 

、何か:

public delegate TServiceType Provider<TServiceType>(); 
public delegate TServiceType Provider<TArg,TServiceType>(TArg argument); 

ザ・あなたは、一般的な工場を作成

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

関連する問題