2016-10-11 71 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); 

,然後添加構造函數BaseController

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

然後添加

: base(_logger) 

所有的控制器構造函數實例後:

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

但是,這是正確的這樣做的方式還是會有一個更「正確」的方式來做到這一點?

+0

您應該閱讀文檔。它可能壓倒所有的信息,但它是我讀過的最好的文檔之一,它包含了所有信息。 –

回答

3

你是否按照文檔? Using Simple Injector

即使您的主控制器應該知道容器,並且不應該通過應用程序廣泛訪問容器。最好在應用程序的Composition Root中創建和配置容器,即根據簡單注入器文檔在Application_Start附近的某處,並且不要將該容器暴露給應用程序的其餘部分。否則,你實際上會以Service Locator Anti Pattern結束。

如可以設置簡單的進樣器用於PerWebApiRequest生活方式的結構的一部分(假設你使用MVC或選擇一個適當的替代)和容器將自動注入的依賴關係到任何的控制器構造和處置IDisposable依賴性沒有你除了配置組合根目錄中的依賴關係之外,不得不執行其他任何操作。因此沒有控制者會永遠不需要知道容器實際存在。

相關問題