ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-19 21:08:13  阅读:646  来源: 互联网

标签:domain-driven-design c


我从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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有