2010-12-18 71 views
3

我想實現一個通用的存儲庫,使用實體框架。通用T GetByID <K>(K ID_)

我的倉庫被定義爲:

public class GenericRepository<T> : IRepository<T> where T : class 

我想補充的地方一般是太傳遞ID的類型的通用GetByID。我真的不希望我的業務邏輯告訴我的類型是e.g ....

_repository.GetByID<int>(123); 

我想隱藏tyoe定義,但不能找出哪裏或如何做到這一點。

Stackoverflow上的大多數帖子似乎只有他們的ID作爲整數。我不想要這個,因爲你的標識符並不總是要整數!

關於這個問題的任何想法?

回答

5

我這樣做

interface IRepository<TEntity, TKey> { 
    TEntity GetById(TKey id); 
} 

然後,我從這個接口

class Person { 
    int ID; 
} 
interface IPersonRepository : IRepository<Person, int> { ... } 

這使得它非常DI/IOC和單元測試友好太繼承。

+0

+1,只是輸入相同的東西。我已經使用過這幾次,沒有任何問題。 – 2010-12-18 19:45:20

+0

虛擬-1。這再次沒有解決問題中提出的主要問題。 BL仍然需要知道類型和**這裏的泛型是錯誤的**因爲只有一種類型的鍵是可以接受的。 – Aliostad 2010-12-18 19:50:06

+0

嗯,我不確定TKey在這裏需要泛型。在99%的情況下,例如排除怪異的PK字段和組合鍵,PK將是一個標識(int)。所以'GetById(int id)'就足夠了。我不認爲需要'TKey'。 – RPM1984 2010-12-19 00:03:22

0

你有沒有試過?:超載

T GetByID(int anint) { 
    return GetByID<int>(anint); 
} 
+0

虛擬-1。客戶端將使用接口而不是實際的類進行通信,因此無法訪問它。 – Aliostad 2010-12-18 19:35:22

+2

什麼是虛擬-1廢話?你是否想說答案是無益的,但不想失去1點的回報? – RPM1984 2010-12-18 23:59:14

1

我已經定義ID爲objectIRepository。有時它是int,有時是Guid,有時是string

它是次優的,但它的工作原理。

interface IRepository<T> 
{ 
    T GetById(object id); 
} 
1

可以定義一個方法,接受類型:

var t = new Thing();

t.GetById<int>(44);

其中

public class Thing 
{ 
public void GetById<T>(T id) 
{ 
} 
}