Par*_*osh 3 c# asp.net design-patterns
我目前正在从事一个使用存储库模式的项目。目前,对于我的数据库中的每个表,我正在构建一个存储库。随着数据库的增长,这变得有点乏味,我想知道我是否需要为每个表做。用户要求能够编辑所有表格,包括那些刚刚在下拉列表中使用的表格。例如,我们有一个 SubContractor 表,它有一个指向 WorkLocation 表的链接。SubContractors 也有一个指向 TypeOfWork 表的链接,仅该部分就让我构建了 3 个存储库。我最初想只构建一个 SubContractor 一个,但是用户又想编辑其中的任何一个,所以我们为每个构建了一个存储库。这是常见的吗?
实际上,您不应该为每个表创建一个存储库,因为存储库是一种模式,用于封装域对象如何转换为另一个数据表示(例如,关系数据库),并将它们再次转换为域对象。
首先,1 个表可能是也可能不是 1 个域对象。实体框架或 NHibernate 等 OR/M 框架不仅仅是将对象映射到表。
一个域对象可能与同一域的其他域对象有关联,这意味着一个域对象可能会被持久化到一个或多个表中,这取决于存储库背后的关系设计。
此外,还有一种常见的做法是仅为根实体实现存储库。例如,有一个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" });
Run Code Online (Sandbox Code Playgroud)
像实体框架或 NHibernate 这样的良好的完整 OR/M 将持久化关联,将员工添加到Employees关联的简单行为将发出INSERT创建整个员工的命令,您将能够使用 LINQ(或任何其他对象查询方法)。
最后,您应该尝试实现一个通用存储库,其中GetById,GetByCriteria(使用表达式树/LINQ 的自定义标准)Add和Remove(不 Update,当您修改对象或集合时,这也由 OR/M 事务处理)两者都可以工作原样或可以派生以提供特定的域要求。
通用存储库签名类似于以下示例:
public interface IGenericRepository<TDomainObject>
where TDomainObject : DomainObject
Run Code Online (Sandbox Code Playgroud)