gpt4 book ai didi

c# - 存储库模式,应该是 1 :1?

转载 作者:行者123 更新时间:2023-12-04 15:31:13 25 4
gpt4 key购买 nike

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

最佳答案

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

首先,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" });

像 Entity Framework 或 NHibernate 这样的完整 OR/M 将保持关联以及将员工添加到 Employees 的简单操作协会将发出 INSERT创建整个员工,您将能够使用 LINQ(或任何其他对象查询方法)查询并获取该员工。

最后,您应该尝试实现一个通用存储库,其中 GetById , GetByCriteria (使用表达式树/LINQ 的自定义标准),AddRemove ( Update,当您修改对象或集合时,这也由 OR/M 事务处理)两者都可以按原样工作,也可以派生为了提供特定的域要求。

通用存储库签名类似于以下示例:

public interface IGenericRepository<TDomainObject>
where TDomainObject : DomainObject

关于c# - 存储库模式,应该是 1 :1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25975960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com