我有一個服務,我希望能夠根據控制反轉原理創建,所以我創建了一個接口和一個服務類。IoC,依賴注入和構造函數參數
public interface IMyService
{
void DoSomeThing1();
void DoSomeThing2();
void DoSomeThing3();
string GetSomething();
}
public class MyService : IMyService
{
int _initialValue;
//...
public MyService(int initialValue)
{
_initialValue = initialValue;
}
public void DoSomeThing1()
{
//Do something with _initialValue
//...
}
public void DoSomeThing2()
{
//Do something with _initialValue
//...
}
public void DoSomeThing3()
{
//Do something with _initialValue
//...
}
public string GetSomething()
{
//Get something with _initialValue
//...
}
}
例如Unity我可以設置我的IoC。
public static class MyServiceIoc
{
public static readonly IUnityContainer Container;
static ServiceIoc()
{
IUnityContainer container = new UnityContainer();
container.RegisterType<IMyService, MyService>();
Container = container;
}
}
問題是構造函數參數。我可以使用參數覆蓋像
var service = MyServiceIoc.Container.Resolve<IMyService>(new ParameterOverrides
{
{"initialValue", 42}
});
但我不想使用失敗類型的參數。如果某人更改構造函數參數名稱或添加一個參數會怎麼樣?他不會在補充時間發出警告,也許沒有人會檢測到它,但最終用戶。也許程序員爲了測試而改變了他的IoC設置,但忘記了它的「發佈」用法,那麼即使代碼覆蓋率爲100%的代碼庫也不會檢測到運行時錯誤。
可以將一個Init函數添加到接口和服務中,但是服務的用戶必須明白這一點,並且每次獲取服務實例時都要記得調用init函數。該服務變得不那麼自我解釋,並且對不正確的用法開放。如果方法不依賴於它們被調用的順序,我認爲最好。
讓它更安全的一種方法是在Ioc上創建一個Create函數。
public static class MyServiceIoc
{
//...
public IMyService CreateService(int initialValue)
{
var service = Container.Resolve<IMyService>();
service.Init(initialValue);
}
}
但是,如果您只關注服務及其接口,上述問題仍然適用。
有沒有人有強大的解決方案來解決這個問題?如何以安全的方式將初始值傳遞給我的服務仍然使用IoC?
謝謝!你關於AnotherClass的陳述可能是正確的,但這不是我關心的,這只是一個例子,因此我已經從我的例子中刪除了它。所以它不會被誤導。抱歉給你帶來不便! – AxdorphCoder