存储库模式,它应该是1:1吗?

时间:2014-09-22 13:59:37

标签: c# asp.net design-patterns

我目前正在开发一个项目,我正在使用Repository Pattern。目前,对于我的数据库中的每个表,我正在构建一个存储库。随着数据库的增长,这变得有点乏味,我想知道我是否需要为每个表做。用户已请求编辑所有表的功能,包括那些仅用于下拉列表的表。例如,我们有一个SubContractor表,它有一个指向WorkLocation表的链接。 SubContractors还有一个指向TypeOfWork表的链接,仅该部分就构建了3个存储库。我最初想过只构建一个SubContractor,但用户想要编辑其中任何一个,所以我们建立了一个存储库。这是常见的吗?

1 个答案:

答案 0 :(得分:4)

实际上,您不应该创建每个存储库,因为存储库是一种模式,用于封装域对象如何转换为另一个数据表示形式(例如,关系数据库),并将它们再次转换为域对象。

首先,1个表可能是也可能不是1个域对象。像Entity Framework或NHibernate这样的OR / M框架不仅仅是将对象映射到表。

域对象可能与同一域的其他域对象有关联,这意味着域对象可能会持久保存到一个或多个表,具体取决于存储库后面的关系设计。

此外,通常的做法是仅为 root 实体实现存储库。例如,Company域对象有很多Employee。您应该设计一个ICompanyRepository并在您最喜欢的OR / M之上编写实施代码,Employee创建将通过将员工添加到Company.Employees 1-n 协会:

ICompanyRepository repo = new CompanyRepositoryImplementation();
Company myCompany = repo.GetById(839984);
myCompany.Employees.Add(new Employee { FullName = "Matias Fidemraizer" });

良好的完整OR / M类实体框架或NHibernate将保持关联,并且将员工添加到Employees关联的简单行为将发出INSERT来创建整个员工,并且您&#39 ; ll能够使用LINQ(或任何其他对象查询方法)查询和获取该员工。

最后,您应该尝试实现一个通用存储库,其中GetByIdGetByCriteria(使用表达式树/ LINQ的自定义条件),AddRemove no Update请在修改对象或集合时由OR / M事务处理,两者都可以工作,或者可以在为了提供特定的域名要求。

通用存储库签名如下所示:

public interface IGenericRepository<TDomainObject>
   where TDomainObject : DomainObject