2013-03-16 51 views
10

假設我有一個通用接口和一個通用實現。我如何註冊所有用途?如何使用TinyIOC註冊通用接口

具體而言,我有以下(減小爲簡單起見):

public interface IRepository<T> where T : TableEntity 
{ 
    T GetById(string partitionKey, string rowKey); 
    void Insert(T entity); 
    void Update(T entity); 
    void Update(string partitionKey, string rowKey, Action<T> updateAction); 
    void Delete(T entity); 
    IQueryable<T> Table { get; } 
} 


public class AzureRepository<T> : IRepository<T> where T : TableEntity 
{ 
    ... 
} 

是否需要一個接一個地註冊所有實施方式中,像這樣:

container.Register<IRepository<Entity1>, AzureRepository<Entity1>>(); 
container.Register<IRepository<Entity2>, AzureRepository<Entity2>>(); 
container.Register<IRepository<Entity3>, AzureRepository<Entity3>>(); 
... 

或者是有一個較短的方式?

+1

這是你在找什麼? https://github.com/grumpydev/TinyIoC/issues/8 – 2013-03-16 14:39:53

+0

否 - 在此示例中,它將所有的IRepository依賴項(IR ,IR 等)註冊爲AzureRepository 。 – seldary 2013-03-16 19:52:42

+0

我可以證實這種行爲(在v1.2中) - 但這顯然是一個錯誤。 – TeaDrivenDev 2013-03-30 00:55:02

回答

10

正如我在評論中提及,TinyIoC在打開泛型的分辨率錯誤 - 它不守解決實例與不同類型的參數分開,並作爲所有註冊與.AsSingleton()默認情況下,它總是返回隱式進行爲所有後續解析請求解析的泛型類型的第一個實例。

由於這個原因,下面不工作:

container.Register(typeof(IRepository<>), typeof(AzureRepository<>)); 

有一種變通方法,但是 - 做登記瞬態:

container.Register(typeof(IRepository<>), typeof(AzureRepository<>)).AsMultiInstance(); 

這將爲每個解決方案創建一個新的實例請求並正確地遵守類型參數。這樣做的缺點是,每次您使用之前已解決的類型參數請求接口時,您也會獲得一個新實例。

編輯

證實。 Open Generics解決方案確實使用了SingletonFactory,一旦它創建了實例,將始終爲後續分辨率返回該實例。它不知道或關心泛型。爲了能夠正常工作,需要GenericSingletonFactory,它不僅保留單個實例,而且還保留一個字典以待解決的具體類型爲關鍵字。

好吧,那不是很難解決。我對此還不夠了解,但確定它確實是完全正確的。

相關問題