9

我有一個帶有2個構造函數的類。告訴StructureMap使用另一個構造函數

MyClass的()

MyClass的(IMyService服務)

我如何告訴StructureMap然後每當我做一個 '新MyClass的()' 它實際上應該稱之爲第二個構造,而不是第一個構造函數。

請幫忙。

回答

20

如果你打電話給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>())) 
+0

如果我想讓它使用具有2個參數的MyClass構造函數,該怎麼辦? 'ctx.GetInstance <>'只允許一個類型參數。 –

5

約書亞的答案涵蓋了所有方面。由於爲了配置Structuremap選擇特定的構造函數沒有硬編碼的參數的構造函數,如約書亞的例子做,你可以使用SelectContructor方法一個側面說明:

x.SelectConstructor<MyService>(() => new MyService()); 

在SelectConstructor方法調用拉姆達應該調用需要的構造函數(爲所有參數提供空值或正確類型的值)。有關更多信息,請參閱the documentation

0

當使用類似結構圖的DI容器時,最好每個類只有一個構造函數。如果IMyService是一個依賴項(雖然看起來有點奇怪),但這個構造函數必須解析該類的所有依賴項,因此在實例化時應始終解決此問題,以便不需要無參數構造函數。

+0

對不起,我現在已經更正。而不是CMyService,我有用戶CMyClass。謝謝。 –

相關問題