使用带有基类的Simple Injector

时间:2016-10-11 06:16:34

标签: c# .net dependency-injection simple-injector

我试图弄清楚使用Simple Injector和Dependency Injection的正确方法是什么。

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

但这是正确的做法吗?还是会有更多的正确的&#34;这样做的方法?

1 个答案:

答案 0 :(得分:3)

您是否关注过文档? Using Simple Injector

即使您的主控制器应该知道容器,也不应该通过应用程序广泛访问容器。最好根据Simple Injector文档在应用程序的Composition Root中创建和配置容器,即Application_Start附近的容器,并且不要将该容器暴露给应用程序的其余部分。否则,您最终会使用Service Locator Anti Pattern

作为配置的一部分,您可以为PerWebApiRequest生活方式设置Simple Injector(假设您正在使用MVC或选择适当的替代方案),容器将自动将依赖项注入任何控制器构造函数并处理{ {1}}依赖项,除了在组合根中配置依赖项之外,您无需执行任何操作。因此,没有控制器必须知道容器实际存在。