【转载】实体框架之领域驱动实践(六):工厂

  首先应该认识到,是对象就有生命周期。这一点无论在面向对象语言还是在领域驱动设计中都适用。在领域驱动设计中,模型对象生命周期可以简要地用下图表示:

28169563317.gif

  通过上图可以看到,对象通过工厂从无到有创建,创建后处于活动状态,此时可以参与领域层的业务处理;对象通过仓储实现持久化(也就是我们常说的“保存”)和重建(也就是我们常说的“读取”)。内存中的对象通过析构而消亡,处于持久化状态的对象则通过仓储进行撤销(也就是我们常说的“删除”)。整个状态转换过程非常清晰。

  现在引出了管理模型对象生命周期的两种角色:工厂和仓储。同时也需要注意的是,工厂和仓储的操作都是基于聚合根(Aggregate Root)的,而不仅仅是针对实体的。关于仓储,内容会比较多,我在下一节单独讲述。在本节介绍一下工厂在.NET实体框架(Entity Framework)中的实现。

在打开了.NET实体框架自动生成的Entity Data Model Source Code文件后,我们发现,.NET实体框架为每一个实体添加了一个工厂方法,该方法包含了一系列原始数据类型和值类型的参数。比如,我们案例中的Customer实体就有如下的代码:

29162276327.gif

  那么在创建一个Customer实体的时候,就可以使用Customer.CreateCustomer工厂方法。看来.NET实体框架已经离领域驱动设计的思想比较接近了,下面有几点需要说明:

  • 使用该工厂方法创建Customer实体时,需要给第一个参数“global::System.Int32 id”赋值,而实际上这个ID值是用在持久化机制上的,在实体对象被创建的时候,这个ID值不应该由开发人员指定。因此,在这里要开发人员强行指定一个id值就显得多余。事实上,.NET实体框架中的每个实体都是继承于EntityObject类,而该类中有个EntityKey的属性,是被用作实体的Key的,因此我们这里的ID值肯定是由持久化机制进行维护的。从这里也可以看出,领域驱动设计中的实体会有两个标识符:一个是基于业务架构的,另一个是基于技术架构的。拿销售订单打比方,我们从界面上看到的更多是类似“SO0029473858” 这样的标识符,而不是一个整数或者GUID
  • 该工厂方法能够创建一个Customer实体,为实体的各个成员属性赋值,并连带创建与该实体相关的值对象,聚合成员(比如Customer的CreditCards)是在使用的时候进行创建并填充的,这样做既符合“对象创建应该基于聚合”的思想,又能提高系统性能。比如,下面的单体测试用来检测使用工厂创建的Customer对象,其CreditCards属性是否为null(如果为null,则证明聚合根并没有合理地维护聚合的完整性):
    301440134452.gif
  • .NET实体框架仅仅为每个实体提供了一个最为简单的工厂方法。“工厂”的概念,在领域驱动设计中具有如下的最佳实践:
    • 工厂可以隐藏对象创建的细节,因为对象的创建不属于业务领域需要考虑的问题
    • 工厂用来创建整个聚合,从而维护聚合所代表的领域含义
    • 可以在聚合根中添加工厂方法,也可以使用工厂类。也就是说,可以创建一个CustomerFactory的类,在其中定义CreateCustomer方法。具体是选用工厂方法还是工厂类,应该根据需求而定
    • 当需要对被创建的实体传入参数时,应该尽可能地减小耦合性,比如可以使用抽象类或者接口作为参数类型

  到这里你会发现,工厂和仓储好像有这一种联系,即它们都能够创建对象,而区别在于,工厂是对象从无到有的创建,仓储则更偏向于“重建”。仓储要比工厂更为复杂,因为仓储需要跟持久化机制这一技术架构打交道。在接下来的文章中,我会介绍一种基于.NET实体框架,但又不被实体框架制约的仓储的实现方式。

 

转载于:https://www.cnblogs.com/beniao/archive/2010/02/04/1663265.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法论,旨在解决软件系统中的复杂性问题。在DDD中,核心思想是将软件系统的设计和实现与业务领域的理解紧密结合起来。 以下是一些应对软件核心复杂性的方法,可以在领域驱动设计中使用: 1. 模型驱动设计:在DDD中,通过建立一个明确的领域模型来描述业务领域。这个模型是基于业务需求和业务专家的知识构建的,可以帮助开发团队更好地理解业务需求,并将其转化为可执行的软件模型。 2. 领域专家参与:在DDD中,领域专家是非常重要的角色。他们对业务领域有深入的理解,并能够提供有价值的业务需求。与领域专家进行密切的合作,可以帮助开发团队更好地理解业务需求,并确保软件系统与业务领域保持一致。 3. 战略设计:DDD提倡将软件系统划分为多个子域(Subdomains),每个子域都有自己的边界和职责。通过对子域进行战略设计,可以将软件系统分解为更小的部分,并将复杂性进行有效管理。 4. 战术设计:在DDD中,战术设计是指将领域模型转化为可执行的代码。通过使用一些常见的DDD设计模式,如聚合根、实体、值对象等,可以帮助开发团队更好地实现领域模型,并保持代码的可维护性和可扩展性。 5. 持续改进:DDD是一个迭代的过程,需要不断地进行学习和改进。通过不断地与业务专家和开发团队进行反馈和沟通,可以发现和解决软件系统中的问题,并不断提高软件系统的质量和性能。 总之,领域驱动设计是一种应对软件核心复杂性的方法,通过建立明确的领域模型、与领域专家合作、战略设计和战术设计等手段,可以帮助开发团队更好地理解业务需求,并将其转化为可执行的软件模型。同时,持续改进也是DDD过程中的重要环节,可以帮助不断提高软件系统的质量和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值