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) 
{ 
} 
} 
相关问题