的範圍標準庫類型考慮以下類型:應對依賴注入
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