簡體   English   中英

如何在MVVM Light的SimpleIoc中注冊實現多個接口的類?

[英]How to register a class that implements multiple interfaces in MVVM Light's SimpleIoc?

假設我有幾個接口和一個實現它們的類:

public interface ISomething1 { /* blablabla */ }
public interface ISomething2 { /* blablabla */ }
public class Service : ISomething1, ISomething2 { /* blablabla x 2 */ }

我想在SimpleIoc中使用以下兩個接口注冊該類:

SimpleIoc.Default.Register<ISomething1, Service >();
SimpleIoc.Default.Register<ISomething2, Service >();

但是這里的第二行拋出一個帶有消息的ArgumentException

已添加具有相同鍵的項目。

我以為這里的關鍵是界面本身,但顯然情況並非如此。 我的想法是使用顯式鍵但是我想通過依賴注入來獲取實例,其中IoC只能與無密鑰注冊表一起使用。

那么我怎么能在這里使用SimpleIoc而不改變任何接口或實現本身呢?

可能這是一個更好的解決方案,因為Service()構造函數可以在ioc容器中注冊依賴項。

SimpleIoc.Default.Register<Service>();
SimpleIoc.Default.Register<ISomething1>(() => SimpleIoc.Default.GetInstance<Service>());
SimpleIoc.Default.Register<ISomething2>(() => SimpleIoc.Default.GetInstance<Service>());

在這里查看源代碼( CodePlex上的SimpleIoc.cs )已經揭示了問題所在。 當使用寄存器功能的這個重載時:

public void Register<TInterface, TClass>(bool createInstanceImmediately)

正如預期的那樣,它會將TInterfaceTClass添加到接口是鍵的字典中,但是它還將TClass及其構造函數添加到另一個字典中,其中類是鍵而不進行任何進一步檢查。

我懷疑它是一個錯誤,好像TClass已經知道(即添加到這個構造函數查找映射)它可以簡單地使用它。


解:

解決方案/解決方法是使用工廠類型的注冊。 這按預期工作:

SimpleIoc.Default.Register<ISomething1>(() => new Service());
SimpleIoc.Default.Register<ISomething2>(() => new Service());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM