编程语言
首页 > 编程语言> > C#-了解DDD(服务,聚合,实体,存储库和规范)

C#-了解DDD(服务,聚合,实体,存储库和规范)

作者:互联网

我从DDD开始,尝试将其应用到当前项目中,但是正如您可以假设的那样,我有成千上万的问题.

在这里,我提供一个示例域,以便我可以提出不同的问题,并作为练习,您可以在上面解释如何制作东西.

我们的假设系统必须控制公司以及每个公司的工作人员.

域.

>公司(ID,名称,地址)
>员工(身份证,姓名,姓氏,年龄)

一个人只能在公司工作,而公司可以有许多员工在公司工作.

运作方式

系统必须允许向公司添加新员工.为此,它将接收公司ID以及新员工的姓名,姓氏,年龄.有一些限制要满足:

>公司中不能有其他具有相同姓名,姓氏和年龄的员工.
>员工可以在另一家公司工作.

问题

我心里一团糟:)

为了实现该操作,我正在考虑:

>服务会接收所有参数.
>服务调用CompanyRepository-> findCompanyById以检索公司实例.
>服务使用指定的参数创建Employee的新实例.
>服务会调用company-> addEmployee将员工附加到公司.
>在公司-> AddEmployee中,检查新员工是否满足条件(规范).
>服务调用CompanyRepository-> save(company)来保留除员工之外的公司.

由于公司员工是作为集群(集合)进行管理的,因此我将公司视为集合的根.

>这是一个好的实现吗?
>如果我将公司员工视为一个集合,以与我描述的挽救集群公司员工的方式相同,那么从存储库中检索公司实例时,我是否也必须检索所有相关员工吗?
>遵守规范我很容易理解如何进行检查,例如,某个雇员的姓名超过10个字符,但是:如果该公司有数千名雇员,如何检查该雇员是否在同一公司中?
>规范可以调用存储库操作吗?如果是,并且考虑将公司员工视为一个集群是正确的事实,那么正确的地方是什么? CustomerRepository-> findEmployeeByName(idCompany,nameEmployee)或更好地创建特定的EmployeeRepository.

解决方法:

1个

好的或坏的只是一个意见. DDD不应成为教条,您可以充分利用DDD和您自己的附件来构建良好的软件体系结构.

2

不可以,公司可以延迟加载员工(即在检索到公司后第一次在运行时访问Employee属性时),或者公司可以实现Load方法,该方法还支持分页以仅加载所需的员工.

3

您应该在存储库级别实现此功能(例如ICompanyRepository.ContainsEmployee(Employee)),并使用基础数据映射器执行此繁重的操作.

另外,我倾向于将规范称为存储库中的前置条件/​​后置条件,因为这是确保在所有情况下都能满足要求的唯一方法.

4

我会避免使用它,但是如果您要确保很多域规则,则需要在规范中使用它们.顺便说一句,我不会使用存储库,而是会使用服务.

正确的位置取决于要求.如果要执行检查以确保域对象以有效状态存储在存储库中,那么如果要从ICompanyRepository.Add或ICompanyRepository.Update或ICompanyRepository.AddOrUpdate中调用规范,则不会发现任何问题.这里的要点是,无论何时将对象状态存储在存储库中以及何时对其进行检索,都不应验证它们的状态.如果您的规范和代码可靠,那么如果存储库已过滤域对象并将其存储在基础数据存储中,则可以确保读取操作将获得有效的域对象.

旁注:虽然您不应该基于基础数据存储(关系型,NoSQL,文件系统…)对域进行建模,但同样,您也不应像教条那样应用DDD.如果基础数据存储提供了更好的方法来定义数据约束,则我将尝试使用它们而不是实施可能仍然需要访问数据的复杂规范.

您的解决方案应在最佳软件体系结构和运行时性能之间取得平衡.

标签:domain-driven-design,c
来源: https://codeday.me/bug/20191119/2038891.html