我试图弄清楚使用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.
}
然后我有IMainController
,ISubController
,TestController
和Test2Controller
。
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;这样做的方法?
答案 0 :(得分:3)
您是否关注过文档? Using Simple Injector
即使您的主控制器应该知道容器,也不应该通过应用程序广泛访问容器。最好根据Simple Injector文档在应用程序的Composition Root中创建和配置容器,即Application_Start
附近的容器,并且不要将该容器暴露给应用程序的其余部分。否则,您最终会使用Service Locator Anti Pattern。
作为配置的一部分,您可以为PerWebApiRequest
生活方式设置Simple Injector(假设您正在使用MVC或选择适当的替代方案),容器将自动将依赖项注入任何控制器构造函数并处理{ {1}}依赖项,除了在组合根中配置依赖项之外,您无需执行任何操作。因此,没有控制器必须知道容器实际存在。