的范围标准库类型考虑以下类型:应对依赖注入
class SomeType
{
public void Configure()
{
var windowsService = new ServiceController("msdtc");
windowsService.Start();
}
}
至少有三个问题。
我们隐含地依赖于
ServiceController
。我们不能单元测试Configure()
。我们有一个
new
运营商,打破了我们的DI战略。
因此,要解决这个问题,我们可以提取其他类型并将其输入给我们的SomeType
。
interface IWindowsService
{
void Start();
}
class WindowsService : IWindowsService
{
private readonly ServiceController _serviceController;
public WindowsService(string serviceName)
{
_serviceController = new ServiceController(serviceName));
}
public void Start() => _serviceController.Start();
}
class SomeType
{
private readonly IWindowsService _msdtcService;
public SomeType(Func<string, IWindowsService> createServiceCallback) //explicit dependency
{
_msdtcService = createServiceCallback.Invoke("msdtc");
}
public void Configure() => _msdtcService.Start();
}
它修复了#1和#2,但我们仍然对新型WindowsService
一个new
运营商的问题。我试图理解应该在DI容器中注册标准ServiceController
还是直接使用它(如上所示)(new
)?
container.RegisterType<ServiceController>();
而且我不知道我们是否应该尝试测试WindowsService
也许会更好重写它是这样的:
class WindowsService : ServiceController, IWindowsService
{
}
由于WindowsService
现在只是继承我们不能在这里测试一切。该类型已经由Microsoft进行过测试。 然而,它打破封装,也许从ISP的SOL I D。因为我们可以投IWindowsService
到WindowsService
甚至到ServiceController
。
处理标准稳定类型的最佳方法是什么? 如果有的话,请转到另一个问题。 在此先感谢。
好的,从你的观点来看,我不需要在di-container中注册ServiceController,并且可以保留隐式依赖关系,对吗? – Serg046
@ Serg046对。你可以注册ServiceController吗?大概。但是自从'SomeType'总是依赖于它,没有多少意义。 – mason
了解,然后看起来像我需要保留'SomeType'是非常小的,并产生尽可能小的业务逻辑,因为它不能被单元测试。指出并等待一段时间的其他一些点。 – Serg046