存储库模式中方法的命名约定?

use*_*993 5 c# design-patterns repository-pattern

我正在尝试学习更好的软件设计,并且最近发现了存储库和服务层模式。据我了解,存储库基本上包含数据访问代码,服务层调用存储库以获取该数据,然后对该数据执行一些逻辑和处理。

到目前为止,到目前为止,还没有阅读储备库提供的一系列方法。但是,存储库通常具有以下方法:

  • 列出/获取/读取/等
  • 创建
  • 保存
  • 更新资料
  • 删除

我正在尝试了解存储库的命名约定。我应该如何称呼“列表/获取/读取/等”。方法?我举一个例子。

我目前正在研究一个将从一堆目录和文件中读取的项目。这些文件表示由完全独立且已存在的系统生成的传感器读数。

方法名称应特定于特定类型的存储库还是使用更通用的名称?如:

通用名称:

interface ISensorRepository
{
    IEnumerable<Sensor> GetAll(); /  IEnumerable<Sensor> ListAll(); / etc.
    Sensor GetByID(int id);
}
Run Code Online (Sandbox Code Playgroud)

实体特定名称:

interface ISensorRepository
{
    IEnumerable<Sensor> GetAllSensors(); / IEnumerable<Sensor> ListAllSensors(); / etc.
    Sensor GetSensorByID(int id);
}
Run Code Online (Sandbox Code Playgroud)

Yor*_*rro 7

我会选择OP的第一个选项“通用命名”

为什么?它是为了避免smurf 命名约定(这是一个编程术语),这就是当你不断重复自己时所做的事情。

您已经命名了存储库所代表的实体类型,为什么要重复自己的所有工作呢?如果您坚持单一职责原则,则不必担心您的抽象存在泄漏。

以下是我试图避免的:

Employee
- EmployeeID
- EmployeeFirstName
- EmployeeLastName
- EmployeeAddress
- EmployeeNumber
- EmployeeAge
- EmployeeEmail
- EmployeeHiringDate
- EmployeeThis
- EmployeeThat
- EmployeeBlabla
- Employee...
- Employee...
Run Code Online (Sandbox Code Playgroud)

有点疯狂吧?


3dd*_*3dd 5

Martin Fowler 在 POEAA 中将其定义Repository为域和数据映射层之间的中介,它的作用类似于内存中的域对象集合。

因为它应该像内存中的集合一样工作,所以我喜欢按如下方式命名我的方法。

public interface IRepository<T> where T : class {
    T Create(T entity);

    void Create(IList<T> entities);

    T Update(T entity);

    T FirstOrDefault(Expression<Func<T, bool>> clause);

    IEnumerable<T> Where(Expression<Func<T, bool>> clause);

    IEnumerable<TResult> Select<TResult>(Expression<Func<T, TResult>> selector);

    T First();

    IEnumerable<T> All();
}
Run Code Online (Sandbox Code Playgroud)

有关该模式的简短讨论,请参阅http://martinfowler.com/eaaCatalog/repository.html

  • 不要创建通用存储库。这是糟糕的设计。 (5认同)
  • 避免返回 `List&lt;T&gt;`。如果消费者将某些内容添加到列表中会发生什么?这会导致数据库更新吗?如果两个不同的消费者同时在列表中添加或删除呢?它们互相影响吗?我不知道会发生什么。使用适合您需求的最通用类型,在本例中为“IEnumerable”或“IQueryable”。 (3认同)
  • 因为您对域做出了假设。当域可能不需要这些时,您可以强制执行 Get/All/Update 等。这是糟糕的设计。 (3认同)