1

私はマルチレイヤーソリューションを設計し、ビジネスロジックを実装するための一連のManagerクラスを作成しました。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、各マネージャークラスの作成時にインスタンス化する必要があります)。

マネージャクラスを静的として定義し、保護されたメンバーをマネージャのメソッドへの呼び出しごとにインスタンス化するための私の選択は何ですか?

4

2 に答える 2

2

ここにはいくつかのオプションがあります。

1)

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

これには、BaseManager を使用してインスタンス化する必要があります。

IoCLocator.Resolve<BaseManager>();

IoCLocatorまたは具体的なもの(MEF、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 コンテナーをインスタンス化し、それに登録BaseManagerしてから、コンテナーからそのインスタンスを解決する必要があります。

これが役に立てば幸いです、イリヤ

アップデート:

あなたのコンセプトはただの混乱です。継承したい静的クラス、静的であるメイン アプリケーション クラスで動作する IoC コンテナー。それぞれのいずれかを選択することをお勧めします。そうすれば、問題は自然に解決します。

于 2011-09-14T10:34:42.110 に答える
2

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

一時的な依存関係を持つシングルトン クラスを持つ方法を探していますか?

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

Windsor は、そのようなファクトリの作成に役立つ型付きファクトリ機能を提供しています: http://docs.castleproject.org/Windsor.Typed-Factory-Facility-interface-based-factories.ashx

于 2011-09-14T11:57:26.787 に答える