2012-10-29 26 views
1

我有3層如何跨多個層

Ç

在層C,我有接口IRepository溶液要求在MEF的特定部分它有兩個實現,RepositoryX和RepositoryY。

在B層,我有接口IController和在層A我有一個名爲Foo的類。現在我知道我可以通過使用契約名稱或導出元數據來控制IRepository的哪個實現被注入到依賴項中。

在Controller的實現中,我可以說我需要RepositoryX或RepositoryY,並且工作正常。

在A層的Foo類中,我對IController進行了依賴注入。我如何控制Foo類的IController將實現哪個IRepository?

我要尋找類似:

class Foo 
{ 
    [Import("RepositoryX")] 
    public IController MyController { get; set; } 

這將注入其擁有本身的控制器的進口財產注入型RepositoryX的存儲庫的一個IController。

有沒有辦法做到這一點,而不必定義2個控制器除了哪個類型的存儲庫是相同的?

回答

1

正如您所說,您的IController實施定義了使用哪個存儲庫以及相應的Import屬性。無論您的IController的實現使用RepositoryX還是RepositoryY在編譯時是已知的,因此導入IController會爲您提供使用在編譯時指定的存儲庫的IController實現。

你不能要求使用你選擇的存儲庫中IController實現,但你可以使存儲庫的屬性,所以你可以導入你想要的資料庫中的Foo實現,並設置它在你的控制器:

class Foo 
{ 
    [ImportingConstructor] 
    public Foo(IController myController, 
       [Import("RepositoryX")] IRepository repository) 
    { 
     myController.Repository = repository; 
    } 
} 
+0

這個解決方案的問題是它破壞了我的圖層的封裝。爲此,我必須在最高層A中引用數據層C中定義的接口。我想如果遵循依賴倒置原則,我的接口應該在B層,但這不是我的情況。 – Gilles