我正在asp.net web 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 frameworkSet<T>已经是通用存储库,因此在该存储库之上添加另一个存储库并不会真正增加很多好处。

08-06 19:30