2014-10-07 66 views
1

我有這樣的現有代碼Repository模式與通用接口和DI在EF

public interface IRepository<T> 
{ 
    void Create(T obj); 
    T Retrieve(string key); 
} 


public class ItemRepository : IRepository<Item> 
{ 
     public void Create(Item obj) 
     { 
      //codes 
     } 

     public Item Retrieve(string key) 
     { 
      //codes 
     }  
} 

我想創建一個通用類的庫,在這裏我必須注入型IRepository來構造,然後用自己的實現的方法。我已經有一個現有的代碼,但它目前是錯誤的

public class Repository 
{ 
    IRepository<T> action = null; 
    public Repository(IRepository<T> concreteImplementation) 
    { 
     this.action = concreteImplementation; 
    } 

    public void Create(T obj) 
    { 
     action.Create(obj); 
    } 
} 

這些類來自EF。如果沒有這方面的解決方法,那麼最好的方法是什麼?

回答

2

如果我正確理解你想要的,可以創建或委託給一個特定的類型庫實現檢索任何類型的對象的單個存儲庫?

您認爲如何工作?你定義了這個Repository類,但是你必須創建實際存儲庫的具體實現才能使用它,然後仍然必須創建一個Repository的實例。爲什麼不使用你必須創建的通用實現呢?

那麼你的Retrieve方法呢?這在你的Repository課程中看起來如何?你會只返回Object?或者你會使你的方法是通用的?

反正回答你的問題,你可以這樣做,我想:

public class Repository 
{ 
    IRepository action = null; 
    public Repository(IRepository concreteImplementation) 
    { 
     this.action = concreteImplementation; 
    } 

    public void Create<T>(T obj) 
    { 
     action.Create(obj); 
    } 
} 

,但你必須將非通用接口爲好,因爲你不能要求一個接口在一個泛型參數構造函數沒有指定類的泛型類型。

public interface IRepository 
{ 
    void Create(object obj); 
    object Retrieve(string key); 
} 

或者,也許你可以通過在類型爲創建方法,而不必一個泛型參數:

public class Repository 
{ 
    IRepository action = null; 
    public Repository(IRepository concreteImplementation, Type respositoryType) 
    { 
     this.action = concreteImplementation; 
     expectedType=repositoryType; 
    } 

    public void Create(Type type, Object obj) 
    { 
     if(type==expected && obj.GetType()==type) 
     { 
      action.Create(obj); 
     } 
    } 
} 

,但兩者都是可怕的想法。只需使用泛型並創建每個類型的存儲庫,它將是最好的長期運行

+0

我正在練習基於這個 http://www.codeproject.com/Articles/615139/An-Absolute-Beginners-Tutorial-on-Dependency-Inver 但它似乎不適用於泛型。無論如何謝謝你的答案。創建單獨的存儲庫將爲我做 – Blues 2014-10-08 23:57:59

0

我想你可能只是在通用存儲庫類的上下文中丟失了T的定義。

嘗試增加<T>到這樣的:

public class Repository<T> 
{ 
    ... 
} 
+0

是的我知道,但如果我指定一個T並使它的一個實例,那麼它然後我不必注入一個具體實現,我必須爲每個實體創建一個存儲庫。你知道任何解決這個問題嗎? – Blues 2014-10-07 06:56:22