我有一個帶有2個構造函數的類。告訴StructureMap使用另一個構造函數
MyClass的()
和
MyClass的(IMyService服務)
我如何告訴StructureMap然後每當我做一個 '新MyClass的()' 它實際上應該稱之爲第二個構造,而不是第一個構造函數。
請幫忙。
我有一個帶有2個構造函數的類。告訴StructureMap使用另一個構造函數
MyClass的()
和
MyClass的(IMyService服務)
我如何告訴StructureMap然後每當我做一個 '新MyClass的()' 它實際上應該稱之爲第二個構造,而不是第一個構造函數。
請幫忙。
如果你打電話給new MyClass()
,那麼StructureMap根本不參與。沒有大量的StructureMap配置會改變行爲。
如果你調用ObjectFactory.GetInstance<MyClass>()
,StructureMap默認情況下將調用具有更多參數的構造函數。
如果你想StructureMap使用不同的構造函數,你可以指定構造(通過PHeiberg的答案):
x.SelectConstructor<IMyClass>(() => new MyClass(null));
或者你可以告訴StructureMap明確如何使用Use()
超載創建實例接受一個Func<>
:
x.For<IMyClass>().Use(ctx => new MyClass(ctx.GetInstance<IMyService>()))
約書亞的答案涵蓋了所有方面。由於爲了配置Structuremap選擇特定的構造函數沒有硬編碼的參數的構造函數,如約書亞的例子做,你可以使用SelectContructor方法一個側面說明:
x.SelectConstructor<MyService>(() => new MyService());
在SelectConstructor方法調用拉姆達應該調用需要的構造函數(爲所有參數提供空值或正確類型的值)。有關更多信息,請參閱the documentation。
當使用類似結構圖的DI容器時,最好每個類只有一個構造函數。如果IMyService
是一個依賴項(雖然看起來有點奇怪),但這個構造函數必須解析該類的所有依賴項,因此在實例化時應始終解決此問題,以便不需要無參數構造函數。
對不起,我現在已經更正。而不是CMyService,我有用戶CMyClass。謝謝。 –
如果我想讓它使用具有2個參數的MyClass構造函數,該怎麼辦? 'ctx.GetInstance <>'只允許一個類型參數。 –