1

私はマルチレイヤーソリューションを設計し、マネージャのビジネスロジックを実装するクラスを作成しました。すべてのマネージャはBaseManagerクラスから派生しています。より明確にするために、ここでUserManagerクラスの次のようスタティッククラスとプロパティを使用した依存性注入

public class UserManager : BaseManager 
{ 
    public void Add(User user) 
    { 
     ... 
    } 
    public void Update(User user) 
    { 
     ... 
    } 
    public void Delete(User user) 
    { 
     ... 
    } 
    public bool GetAccessPermissions(User user) 
    { 
     ... 
    } 
} 

BaseManagerは次のとおりです。彼らは彼らのそれに関連するエンティティを取得するので、私のマネージャクラスはすべて、静的に定義されるべきであると

public class BaseManager 
{ 
    protected IRepository repository = IoCLocator.Resolve<IRepository>(); 
    public BaseManager() 
    { 
     ... 
    } 
    // Some shared methods among manager classes. 
} 

今、私は懐疑的パラメータとして、操作したい。しかし、あなたが見るように、私はいくつかの共有されたプライベート/保護されたメンバーを持っています。 (例:repositoryは、各マネージャクラスの作成時にインスタンス化する必要があります)。

管理者クラスを静的に定義し、管理者メソッドの呼び出しごとに保護されたメンバーをインスタンス化する選択肢は何ですか?

答えて

2

あなたのマネージャークラスは静的である必要がありますか、それともシングルトンにしたいだけですか?

一時的な依存関係を持つシングルトンクラスを使用する方法をお探しですか?

この場合、シングルトンマネージャクラスは、必要に応じてリポジトリのインスタンスを作成できるファクトリに依存する必要があります。

ウィンザーは、このような工場を作成するのに役立ちます型付き工場施設を提供しています: http://docs.castleproject.org/Windsor.Typed-Factory-Facility-interface-based-factories.ashx

2

あなたがここにいくつかのオプションがあります:

1)

public class BaseManager 
    { 
     protected IRepository repository; 
     public BaseManager(IRepository _repository) 
     { 
      repository = _repository 
     } 
     // Some shared methods among manager classes. 
    } 

これは、具体的なIoCLocator(MEFに応じて、

IoCLocator.Resolve<BaseManager>(); 

またはそのような何かを使用してBaseManagerをインスタンス化する必要がありますUnity、Ninject、またはあなたが使用しているもの)

2) ほとんど同じ:

public class BaseManager 
    { 
     protected IRepository repository; 
     public BaseManager(IoCLocator locator) 
     { 
      repository = locator.Resolve<IRepository>(); 
     } 
     // Some shared methods among manager classes. 
    } 

3)または、直接

public class BaseManager 
{ 
    [InjectFromContainer] 
    protected IRepository repository {get;set;} 

    public BaseManager() 
    { 
     repository = locator.Resolve<IRepository>(); 
    } 
    // Some shared methods among manager classes. 
} 

をプロパティを注入し、それはあなたのコンテナに依存しているため、私は正確に、あなたが必要とする属性を指定することはできません。 とにかく、BootStrapperでIoC Containerをインスタンス化し、BaseManagerを登録してから、そのインスタンスをコンテナから解決する必要があります。このことができます

希望、イリヤ

UPDATE:

あなたの概念はただ混乱です。継承したい静的クラス、主アプリケーションクラスで動作するIoCコンテナは静的です。私はあなたのそれぞれの1つを選択することをお勧めします、そして、問題は単独で消えてしまいます。

+0

私は十分に明確ではなかったと思います。私はここで達成しようとしていること( 'BaseManager'と' UserManager')静的マネージャーを定義し、すべての呼び出しでインスタンス化されますのIoCを使用することにより、静的リポジトリ変数へのアクセス権を持つことです。あなたのリポジトリが静的な場合は – Kamyar

+0

?保護されているのは何ですか?リポジトリのメンバーが(UserManager' 'のような)すべての子クラスに表示されますので、私は保護された使用 –

+0

。各呼び出しごとにリポジトリを定義する必要はありません。 – Kamyar

関連する問題