![](/img/trans.png)
[英]How to register a range of dependencies in 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)
正如預期的那樣,它會將TInterface和TClass添加到接口是鍵的字典中,但是它還將TClass及其構造函數添加到另一個字典中,其中類是鍵而不進行任何進一步檢查。
我懷疑它是一個錯誤,好像TClass已經知道(即添加到這個構造函數查找映射)它可以簡單地使用它。
解決方案/解決方法是使用工廠類型的注冊。 這按預期工作:
SimpleIoc.Default.Register<ISomething1>(() => new Service());
SimpleIoc.Default.Register<ISomething2>(() => new Service());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.