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)
我会选择OP的第一个选项“通用命名”
为什么?它是为了避免smurf 命名约定(这是一个编程术语),这就是当你不断重复自己时所做的事情。
您已经命名了存储库所代表的实体类型,为什么要重复自己的所有工作呢?如果您坚持单一职责原则,则不必担心您的抽象存在泄漏。
以下是我试图避免的:
Employee
- EmployeeID
- EmployeeFirstName
- EmployeeLastName
- EmployeeAddress
- EmployeeNumber
- EmployeeAge
- EmployeeEmail
- EmployeeHiringDate
- EmployeeThis
- EmployeeThat
- EmployeeBlabla
- Employee...
- Employee...
Run Code Online (Sandbox Code Playgroud)
有点疯狂吧?
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