我目前正在开发一个项目,我正在使用Repository Pattern。目前,对于我的数据库中的每个表,我正在构建一个存储库。随着数据库的增长,这变得有点乏味,我想知道我是否需要为每个表做。用户已请求编辑所有表的功能,包括那些仅用于下拉列表的表。例如,我们有一个SubContractor表,它有一个指向WorkLocation表的链接。 SubContractors还有一个指向TypeOfWork表的链接,仅该部分就构建了3个存储库。我最初想过只构建一个SubContractor,但用户想要编辑其中任何一个,所以我们建立了一个存储库。这是常见的吗?
答案 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(或任何其他对象查询方法)查询和获取该员工。
最后,您应该尝试实现一个通用存储库,其中GetById
,GetByCriteria
(使用表达式树/ LINQ的自定义条件),Add
和Remove
( no Update
请在修改对象或集合时由OR / M事务处理,两者都可以工作,或者可以在为了提供特定的域名要求。
通用存储库签名如下所示:
public interface IGenericRepository<TDomainObject>
where TDomainObject : DomainObject