2016-10-11 9 views
0

シンプルインジェクタと依存性注入を使用する正しい方法が何かを理解しようとしています。シンプルインジェクタをベースクラスで使用する

私はMasterControllerを持っており、その下で動作するコントローラはほとんどありません。だから、基本的に私はMasterControllerを達成しようとしています。別のクラスや多分私のユーザーインターフェイスから使うことができます。

public class MasterController 
{ 
    public static Container _container = new Container(); 

    ILogger logger; 

    public IMainController MainController; 
    public ISubController SubController; 

    public MasterController() 
    { 
     _container.Register<ILogger, DebugLogger>(Lifestyle.Singleton); 
     _container.Register<IMainController, TestController>(Lifestyle.Singleton); 
     _container.Register<ISubController, Test2Controller>(Lifestyle.Transient); 

     _container.Verify(); 

     logger = _container.GetInstance<ILogger>(); 
     MainController = _container.GetInstance<IMainController>(); 
    } 

    public void RenameMainController(string _name) 
    { 
     MainController.Name = _name; 
    } 

    // more code here. 
} 

それから私は私のIMainControllerISubControllerTestControllerTest2Controllerを持っています。

public interface IMainController 
{ 
    string Name { get; set; } 
    void DoSomething(); 
} 

public interface ISubController 
{ 
    string Name { get; set; } 
    void DoSomething(); 
    void SomeExtraFunctionality(); 
} 

public class TestController : BaseController, IMainController 
{ 
    private ILogger logger; 

    public List<ISubController> SubControllers = new List<ISubController>(); 

    public TestController(ISubController _SubController, ILogger _logger) 
    { 
     logger = _logger; 

     SubControllers.Add(_SubController); 
     logger.Log("TestController ready"); 
    } 

    public void DoSomething() { } 
} 

public class Test2Controller : BaseController, ISubController 
{ 
    private ILogger logger; 

    public Test2Controller(ILogger _logger) 
    { 
     logger = _logger; 
     logger.Log("TestController ready"); 
    } 

    public void DoSomething() { } 
    public void SomeExtraFunctionality() { } 
} 

私の考えは、私はいくつかのコントローラを持っており、彼らはBaseController

public class BaseController 
{ 
    public string Name { get; set; } 

    // here is some code. 
} 

からいくつかの共通のものを使用する。しかしBaseControllerに、私はまた、ILoggerですを使用したいということです。私はそれをどうやって正しい方法で行うのですか?

これで、BaseControllerをコンテナに追加しました。

_container.Register<BaseController>(Lifestyle.Transient); 

そして

public BaseController(ILogger _logger) 
    { 
     logger = _logger; 
    } 

BaseController

にコンストラクタを追加し、すべてのコントローラのコンストラクタの例の後に

: base(_logger) 

を追加します。

public TestController(ISubController _SubController, ILogger _logger) : base(_logger) 

をしかし、これが正しいですこれを行う方法、またはこれを行うための "正しい"方法がありますか?

+0

ドキュメントを読む必要があります。それはすべての情報を圧倒しているかもしれませんが、私が読んだ最高のドキュメントの一つです。 –

答えて

3

ドキュメントに従ったことはありますか? Using Simple Injector

マスタコントローラでもコンテナを認識する必要があります。アプリケーションを通じてコン​​テナにアクセスできないようにする必要があります。アプリケーションのComposition Root、つまりSimple Injectorのドキュメントの通りApplication_Startの近くにコンテナを作成して設定し、そのコンテナをアプリケーションの残りの部分に公開しないでください。そうでなければ、実質的にService Locator Anti Patternになります。

もしPerWebApiRequestライフスタイル(あなたがMVCを使用するか、または適切な代替物を選択していると仮定して)のための簡単なインジェクタを設定することができ、コンテナは自動的にコントローラのコンストラクタへの依存性を注入し、あなたなしIDisposable依存関係を廃棄します構成の一部としてコンポジションルートに依存関係を設定する以外は何もしなくてはなりません。したがって、コントローラが実際に存在することを認識する必要はありません。

関連する問題