实现通用存储库模式 - 实体键类型
Implementing Generic Repository Pattern - entity key type
我正在 Asp.Net 网络 api 应用程序中实施存储库模式。
public abstract class Repository<T> : IRepository<T> where T : EntityBase
{
private DbContext context_;
public Repository(DbContext context)
{
context_ = context;
}
public virtual async Task<T> GetAsync(int id)
{
return await context_.Set<T>().FindAsync(id);
}
...
}
问题:
这里我有一个方法 GetAsync(int id)
,它适用于具有 int
类型的单个键的实体。
但有些实体的键为 string
类型,有些实体的键为复合键。
问题:
我该如何解决这个问题?
是否可以通过通用方式解决该问题?
您会注意到 FindAsync
接受对象数组作为参数,因此您可以像这样更改 GetAsync
:
public virtual Task<T> GetAsync(params object[] keys)
{
return context_.Set<T>().FindAsync(keys);
}
然后你可以用你喜欢的任何键调用GetAsync
,例如:
GetAsync(1);
GetAsync("string key");
GetAsync(1, "composite key");
旁注:entity framework Set<T>
已经是通用存储库,因此在那个存储库上添加另一个存储库并没有真正增加太多好处。
我正在 Asp.Net 网络 api 应用程序中实施存储库模式。
public abstract class Repository<T> : IRepository<T> where T : EntityBase
{
private DbContext context_;
public Repository(DbContext context)
{
context_ = context;
}
public virtual async Task<T> GetAsync(int id)
{
return await context_.Set<T>().FindAsync(id);
}
...
}
问题:
这里我有一个方法 GetAsync(int id)
,它适用于具有 int
类型的单个键的实体。
但有些实体的键为 string
类型,有些实体的键为复合键。
问题:
我该如何解决这个问题?
是否可以通过通用方式解决该问题?
您会注意到 FindAsync
接受对象数组作为参数,因此您可以像这样更改 GetAsync
:
public virtual Task<T> GetAsync(params object[] keys)
{
return context_.Set<T>().FindAsync(keys);
}
然后你可以用你喜欢的任何键调用GetAsync
,例如:
GetAsync(1);
GetAsync("string key");
GetAsync(1, "composite key");
旁注:entity framework Set<T>
已经是通用存储库,因此在那个存储库上添加另一个存储库并没有真正增加太多好处。