存储库模式 - 方法太多

Boo*_*oks 8 c# design-patterns

我经常看到示例存储库模式,如下所示:

public interface IRepository<T>
{
    T GetById(int id);
    IEnumerable<T> GetAllByName(string name);
}
Run Code Online (Sandbox Code Playgroud)

但是,您如何处理可能需要进行复杂搜索的案例?我不认为向界面添加许多方法会使它最终看起来像是一个好主意:

IEnumerable<T> GetAllByFirstName(string name);
IEnumerable<T> GetAllByLastName(string name);
IEnumerable<T> GetAllByFirstAndLastName(string name);
IEnumerable<T> GetAllByAddress(string name);
...
...
...
Run Code Online (Sandbox Code Playgroud)

Era*_*nga 6

使用Predicate Builder动态构建where条件

public interface IRepository<T>
{
    T GetById(int id);

    IEnumerable<T> GetAllBy(Expression<Func<T, bool>> predicate);
}
Run Code Online (Sandbox Code Playgroud)

然后建立条件

  var predicate = PredicateBuilder.True<Customer>();
  if (!string.IsNullOrEmpty(FirstName))
  {
       predicate = predicate.And(d => d.FirstName.Contains(FirstName));
  }

  if (!string.IsNullOrEmpty(LastName))
  {
       predicate = predicate.And(d => d.LastName.Contains(LastName));
  }

  var products = productRepo.GetAllBy(predicate);
Run Code Online (Sandbox Code Playgroud)

创建一个类来传递搜索条件

public class CustomerFilterCriteria
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string Address { get; set; }

}

public interface IRepository<T>
{
    T GetById(int id);
    IEnumerable<T> GetAllBy(CustomerFilterCriteria criteria);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我不能使用表达式怎么办?例如,如果我必须使用存储库后面的存储过程? (2认同)