簡體   English   中英

通過基類使用Simple Injector

[英]Using Simple Injector with base classes

我正在嘗試找出使用簡單注入器和依賴注入的正確方法。

我有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)

但這是這樣做的正確方法,還是會有更多“正確”的方法呢?

您是否關注文檔? 使用簡單的進樣器

甚至您的主控制器都不應該知道容器,並且不應通過應用程序廣泛訪問該容器。 最好在應用程序的“ 合成根目錄”中創建和配置容器,即根據Simple Injector文檔在Application_Start附近的某個位置,並且不要將該容器暴露給應用程序的其余部分。 否則,您實際上將獲得服務定位器反模式

作為配置的一部分,您可以為PerWebApiRequest生活方式設置Simple Injector(假設您正在使用MVC或選擇適當的替代方法),並且容器將自動將依賴項注入任何控制器構造函數中並處置IDisposable依賴項,而無需執行任何操作除了在組合根目錄中配置依賴項之外。 因此,任何控制器都不必知道容器實際存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM