[英]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.
}
然后我有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)
但這是這樣做的正確方法,還是會有更多“正確”的方法呢?
您是否關注文檔? 使用簡單的進樣器
甚至您的主控制器都不應該知道容器,並且不應通過應用程序廣泛訪問該容器。 最好在應用程序的“ 合成根目錄”中創建和配置容器,即根據Simple Injector文檔在Application_Start
附近的某個位置,並且不要將該容器暴露給應用程序的其余部分。 否則,您實際上將獲得服務定位器反模式 。
作為配置的一部分,您可以為PerWebApiRequest
生活方式設置Simple Injector(假設您正在使用MVC或選擇適當的替代方法),並且容器將自動將依賴項注入任何控制器構造函數中並處置IDisposable
依賴項,而無需執行任何操作除了在組合根目錄中配置依賴項之外。 因此,任何控制器都不必知道容器實際存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.