2010-12-28 12 views
0

すべてのコントローラから同じリポジトリセットを消費する傾向があります。つまり、すべてのコントローラでIoCを使用してリポジトリオブジェクトをインスタンス化します。ベースコントローラからコントローラを派生させる正しい方法

私はコントローラを1つの場所でこれらのオブジェクトをインスタンス化できるベースコントローラから派生できると思います。これを行う権利を教えてください。ご協力ありがとうございました。

答えて

3

あなたはいくつかの選択肢があり、どれが「正しい方法」であるかは本当にあなた次第であり、どのようにシステム全体がどのように機能するかです。

さらに
public class BaseController 
{ 
    protected ISomeRepository myRepository = IoCContainer.Resolve<ISomeRepository>(); 
} 
public class MyController : BaseController { } 

、あなたはなく、ベースコントローラのコンストラクタに初期化を移動することができ:

一つのオプションは、のような単純なものでしたなど、検討する必要があるさまざまなインスタンス化されたオブジェクトのためのパフォーマンスの問題があるかもしれませんそれはそれのようなインラインである。

public class BaseController 
{ 
    private ISomeRepository _myRepository; 
    protected ISomeRepository myRepository 
    { 
     get 
     { 
      if (_myRepository == null) 
       _myRepository = IoCContainer.Resolve<ISomeRepository>(); 
      return _myRepository; 
     } 
    } 
} 

:それらすべてを有する(それらをインスタンスのヒットで慎重に秤量)パフォーマンスヒットを招き、平均で彼らは常に必要ではない場合

別のオプションは、後期結合したリポジトリにあるかもしれませんあなたにはおそらくより多くのオプションが用意されています。設定はセットアップによって異なります。あなたの特定のIoCコンテナがどのように機能するかは、デザインの決定に大きく影響するかもしれません。実際

(私は簡潔かつ簡単にするために、直接ここにIoCContainerを参照していますが、コンテナ自体にそれほど多くの参照を持っていないように私はサービスロケータの背後にあるコンテナを抽象化をお勧めします。)

1

それらの「共通リポジトリ」がどのようなタスクを完了するべきかによって異なります。彼らが何をすべきかと直接関係しているのであれば大丈夫です。しかし、あなたはとにかくIoC解像度でいくつかの問題に直面します。新しいリポジトリごとにこれらのリポジトリを常時挿入しないようにするには、ベースコントローラのService Locatorに依存する必要があります。それは良いことではありません。

これらのリポジトリが、アクションが行うこととは正反対のものであれば、AOPのようなロジックなので、アクションフィルタを使用する方が良いでしょうかRenderActionです。

よくあるケースでは、層のスーパータイプの依存関係を避けようとします。構成の継承

関連する問題