实现通用存储库模式 - 实体键类型

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> 已经是通用存储库,因此在那个存储库上添加另一个存储库并没有真正增加太多好处。