2016-03-08 14 views
5

私はIoCコンテナとしてMicrosoft Unityを使用しています。拡張クラスの依存性注入?

public static class BusinessObjectExtensions 
{ 
    public static bool CanDoStuff(this BusinessObject obj) 
    { 
     var repository = BusinessHost.Resolver.Resolve<IRepository>(); 
     var args = new EArgument { Name = obj.Name }; 
     return repository.AMethod(obj.UserName, args); 
    } 
} 

は拡張クラスのための依存性注入を管理するためのより良い方法はあります:私は私のビジネスに便利なメソッドを追加する拡張クラスの数が これは私が今日使用したコードの一種であるオブジェクトがありますか?

+0

私が思うに、それは '拡張method'すべき要件を有する表示されません。..非常に多くの依存オブジェクトがされています彼らの – Moumit

答えて

2

あなたは、実際に彼らは唯一の内部データ(クラス自体のプロパティ)、またはメソッドに提供される単純なデータ型では動作しない限り、extensionmethodsを回避しようとしてください。拡張メソッドの他の依存関係と話すべきではありません。このルールに従えば、拡張クラスにIoCをまったく注入する必要はありません。

+1

それは良い点です。たぶん私はマネージメントクラスを作成する必要があります... – Leonard

4

静的クラスでは、コンストラクタインジェクションによるデフォルトの依存性注入方法は使用できません。下記のようなパラメータ注入を使用することは可能ですが、それは非常にクリーンな方法ではありません。

public static class BusinessObjectExtensions 
{ 
    public static bool CanDoStuff(this BusinessObject obj, IRepository repository) 
    { 
     var args = new EArgument { Name = obj.Name }; 
     return repository.AMethod(obj.UserName, args); 
    } 
} 
1

なぜあなたはそうしますか?

これは、アプリケーションの屋根への結合を高め、チームメイトが拡張メソッドを使用するのが非常に混乱する可能性があります(メソッドを使用するたびにリポジトリを挿入することに注意してください)。

代わりに、別のクラスを作成し、IRepositoryインスタンスを注入するコンストラクタ・インジェクションを使用します。

public class StuffExecuter  
{ 
    private readonly IRepository _repository; 

    public StuffExecuter(IRepository repository) 
    { 
     _repository = repository; 
    } 

    public bool CanExecute(BusinessObject obj) 
    { 
     _repository.Add(obj.UserName, new EArgument 
     { 
      Name = obj.Name 
     }); 
    } 
} 
+0

これは私たちが設計したものですが、上記の例は、完全に分離されていないものではないにしても、本当に具体的な例から抜粋したものです。ビジネスオブジェクトが必要でした。後見では良いアイデアではなかったので、私は別の場所に移します。ありがとうございました! – Leonard