我正在尝试使用实体框架实现通用存储库。
我的存储库定义为:
public class GenericRepository<T> : IRepository<T> where T : class
我想添加一个通用的GetByID,其中传入的ID类型也是通用的。我真的不希望我的业务逻辑告诉我类型是...... ....
_repository.GetByID<int>(123);
我想隐藏tyoe定义,但无法弄清楚在哪里或如何做到这一点。
Stackoverflow上的大多数帖子似乎只是将其ID作为整数。我不希望这样,因为你的标识符并不总是整齐的!
关于这个问题的任何想法?
答案 0 :(得分:5)
我做了这个
interface IRepository<TEntity, TKey> {
TEntity GetById(TKey id);
}
然后我继承了这个界面
class Person {
int ID;
}
interface IPersonRepository : IRepository<Person, int> { ... }
这使得DI / IoC和单元测试非常友好。
答案 1 :(得分:1)
我已在object
中将ID定义为IRepository
。有时它是int
,有时是Guid
,有时是string
。
这是次优的但是有效。
interface IRepository<T>
{
T GetById(object id);
}
答案 2 :(得分:1)
您可以将方法定义为接受类型:
var t = new Thing();
t.GetById<int>(44);
其中
public class Thing
{
public void GetById<T>(T id)
{
}
}
答案 3 :(得分:0)
您是否尝试过载?:
T GetByID(int anint) {
return GetByID<int>(anint);
}