2014-07-26 38 views
1

假設我有一個通用接口和一個實現它的泛型類。在Unity中具有優先級/回退和泛型的依賴注入

interface IRepository<TModel> { } 

[RegisterGeneric(typeof(IRepository<>))] 
class GenericRepository<TModel> : IRepository<TModel> { } 

而且兩款車型UserOrderUser沒有什麼特別之處,所以它使用通用的存儲庫實現。 Order是不同的,所以我有一個特定的存儲庫。

[Register(typeof(IRepository<Order>))] 
class OrderRepository : GenericRepository<Order> { } 

同時你可以看到我用兩個屬性,這樣我可以掃描屬性和自動應用程序啓動時它們註冊到Unity。我要的是:

  1. IRepository<User>映射到GenericRepository<User>
  2. IRepository<Order>映射到OrderRepository

在功能的新機型,如果特定的資源庫中添加(如訂單)中,接口應該被映射到特定的實現。否則它映射到通用的。我如何實現優先功能?

回答

1

在Unity中,當您進行多次註冊時,Unity會在最後一次註冊成爲「默認」註冊時爲您建立一系列註冊。所以在這方面,你應該可以做到以下幾點:

container.RegisterType(typeof(IRepository<>), typeof(GenericRepository<>)); 

// Override multiple specific implementations (I image batch registration here) 
container.RegisterType(typeof(IRepository<Order>), typeof(OrderRepository)); 
container.RegisterType(typeof(IRepository<Customer>), typeof(CustomerRepository)); 
+0

你是對的。我犯了另一個愚蠢的錯誤,導致一切工作不正確。 –

+0

順便說一下,即使你在'IRepository <>'之前註冊'IRepositry ','IRepository '仍然具有更高的優先級,unity已經處理它們的優先級,不僅僅是註冊順序。 –

+0

@DannyChen:嗯,有趣,所以這種行爲與簡單注射器如何處理這一點是一樣的。開放通用註冊通過未註冊的類型解析來處理,這意味着當缺少具體註冊時,它們總是用作後備。 – Steven