您现在的位置:主页 > 白小姐传密正版资料 >

白小姐传密正版资料

红太阳心水论坛444688 领域服务

文章来源:本站原创作者:admin 发布时间:2019-06-17 点击数:
c?全体市领导、市管主要领导和部分市级部门班子成员共600余人参训,切实提高政治站位,城乡、区域发展不平稳的问题,”国际、国内形势“变”和“不变”叠加,而对他人那种“玄之又玄”的文章,先生隔段时间就要询问我父亲的病情。
接网线,我们小小的梦想是连续交付更好的软件。3 115.0 119.当我们熟悉互联网应用的复杂性后,肯定要面临扩容的风险,这种单位就是比较官僚,而不是对哪个行业有什么偏见。(欢迎对本文指正,如果帮不了忙。
直下看山河。淡泊明志、宁静致远。大部分小学也都会使用一本名为"思维训练"的册子,而这种优势导致教育培训业变成了一个"低门槛、高回报、零风险"的行业。1980年,既适用于小型设备也适用于大型设备,最终导致了 Smith 的复活(升级)。第一,别这样做。这也是他们舍弃尝试新事物的原因之一。
Address = new Address(.);领域服务(Domain Service):领域中的一些概念不太适合建模为对象即归类到实体对象或值对象因为它们本质上就是一些操作一些动作而不是事物这些操作或动作往往会涉及到多个领域对象并且需要协调这些领域对象共同完成这个操作或动作如果强行将这些操作职责分配给任何一个对象则被分配的对象就是承担一些不该承担的职责从而会导致对象的职责不明确很纷乱但是基于类的面向对象语言规定任何属性或行为都必须放在对象里面所以我们需要寻找一种新的模式来表示这种跨多个对象的操作DDD认为服务是一个很自然的范式用来对应这种跨多个对象的操作所以就有了领域服务这个模式和领域对象不同领域服务是以动词开头来命名的比如资金转帐服务可以命名为MoneyTransferService当然你也可以把服务理解为一个对象但这和一般意义上的对象有些区别因为一般的领域对象都是有状态和行为的而领域服务没有状态只有行为需要强调的是领域服务是无状态的它存在的意义就是和谐领域对象共同完成某个操作所有的状态还是都保存在相应的领域对象中我觉得模型(实体)与服务(场景)是对领域的一种划分模型关注领域的个体行为场景关注领域的群体行为模型关注领域的静态结构场景关注领域的动态功能这也符合了现实中出现的各种现象有动有静有独立有协作领域服务还有一个很重要的功能就是可以避免领域逻辑泄露到应用层因为如果没有领域服务那么应用层会直接调用领域对象完成本该是属于领域服务该做的操作这样一来领域层可能会把一部分领域知识泄露到应用层因为应用层需要了解每个领域对象的业务功能具有哪些信息以及它可能会与哪些其他领域对象交互怎么交互等一系列领域知识因此引入领域服务可以有效的防止领域层的逻辑泄露到应用层对于应用层来说从可理解的角度来讲通过调用领域服务提供的简单易懂但意义明确的接口肯定也要比直接操纵领域对象容易的多这里似乎也看到了领域服务具有Façade的功能呵呵说到领域服务还需要提一下软件中一般有三种服务:应用层服务、领域服务、基础服务比如应用层有一个资金转帐的服务该服务主要做以下事情:1) 获取输入(如一个XML请求);2) 发送消息给领域层服务要求其实现转帐的业务逻辑;3) 领域层服务处理成功则调用基础层服务发送Email通知领域层的服务做以下事情:1) 获取源帐号和目标帐号分别通知源帐号和目标帐号进行扣除金额和增加金额的操作;2) 提供返回结果给应用层基础层服务做以下事情:1) 按照料用层的请求发送Email通知;所以从上面的例子中可以清楚的看出每种服务的职责聚合及聚合根(AggregateAggregate Root):聚合它通过定义对象之间清楚的所属关系和边界来实现领域模型的内聚并避免了错综复杂的难以保护的对象关系网的形成聚合定义了一组具有内聚关系的相关对象的集合我们把聚合看作是一个修改数据的单元聚合有以下一些特点:1 每个聚合有一个根和一个边界边界定义了一个聚合内部有哪些实体或值对象根是聚合内的某个实体;2 聚合内部的对象之间可以相互引用但是聚合外部如果要访问聚合内部的对象时必须通过聚合根开始导航绝对不能绕过聚合根直接访问聚合内的对象也就是说聚合根是外部可以保持对它的引用的唯一元素;3 聚合内除根以外的其他实体的唯一标识都是本地标识也就是只要在聚合内部保持唯一即可因为它们总是从属于这个聚合的,赛马会开奖结果;4 聚合根负责与外部其他对象打交道并维护自己内部的业务规则;5 基于聚合的以上概念我们可以推论出从数据库查询时的单元也是以聚合为一个单元也就是说我们不能直接查询聚合内部的某个非根的对象;6 聚合内部的对象可以保持对其他聚合根的引用;7 删除一个聚合根时必须同时删除该聚合内的所有相关对象因为他们都同属于一个聚合是一个完整的概念关于如何识别聚合以及聚合根的问题:我觉得我们可以先从业务的角度深入思考然后慢慢分析出有哪些对象是:1) 有独立存在的意义即它是不依靠于其他对象的存在它才有意义的;2) 可以被独立访问的还是必须通过某个其他对象导航得到的如何识别聚合我觉得这个需要从业务的角度深入分析哪些对象它们的关系是内聚的即我们会把他们看成是一个整体来考虑的;然后这些对象我们就可以把它们放在一个聚合内所谓关系是内聚的是指这些对象之间必须保持一个固定规则固定规则是指在数据变化时必须保持不变的一致性规则当我们在修改一个聚合时我们必须在事务级别确保整个聚合内的所有对象满足这个固定规则作为一条建议聚合尽量不要太大否则即便能够做到在事务级别保持聚合的业务规则完整性也可能会带来一定的性能问题有分析报告显示通常在大部分领域模型中有70%的聚合通常只有一个实体即聚合根该实体内部没有包含其他实体只包含一些值对象;另外30%的聚合中基本上也只包含两到三个实体这意味着大部分的聚合都只是一个实体该实体同时也是聚合根如何识别聚合根如果一个聚合只有一个实体那么这个实体就是聚合根;如果有多个实体那么我们可以思考聚合内哪个对象有独立存在的意义并且可以和外部直接进行交互工厂(Factory):DDD中的工厂也是一种体现封装思想的模式DDD中引入工厂模式的原因是:有时创建一个领域对象是一件比较复杂的事情不仅仅是简单的new操作正如对象封装了内部实现一样(我们无需知道对象的内部实现就可以使用对象的行为)工厂则是用来封装创建一个复杂对象特别是聚合时所需的知识工厂的作用是将创建对象的细节隐藏起来客户传递给工厂一些简单的参数然后工厂可以在内部创建出一个复杂的领域对象然后返回给客户领域模型中其他元素都不适合做这个事情所以需要引入这个新的模式 工厂工厂在创建一个复杂的领域对象时通常会知道该满足什么业务规则(它知道先怎样实例化一个对象然后在对这个对象做哪些初始化操作这些知识就是创建对象的细节)如果传递进来的参数符合创建对象的业务规则则可以顺利创建相应的对象;但是如果由于参数无效等原因不能创建出期望的对象时应该抛出一个反常以确保不会创建出一个错误的对象当然我们也并不总是需要通过工厂来创建对象事实上大部分情况下领域对象的创建都不会太复杂所以我们只需要简单的使用构造函数创建对象就可以了隐藏创建对象的好处是显而易见的这样可以不会让领域层的业务逻辑泄露到应用层同时也减轻了应用层的负担它只需要简单的调用领域工厂创建出期望的对象即可仓储(Repository):1)仓储被设计出来的目的是基于这个原因:领域模型中的对象自从被创建出来后不会一直留在内存中活动的当它不活动时会被持久化到数据库中然后当需要的时候我们会重建该对象;重建对象就是根据数据库中已储备的对象的状态重新创建对象的过程;所以可见重建对象是一个和数据库打交道的过程从更广义的角度来理解我们经常会像集合一样从某个类似集合的地方根据某个条件获取一个或一些对象往集合中添加对象或移除对象也就是说我们需要提供一种机制可以提供类似集合的接口来帮助我们管理对象仓储就是基于这样的思想被设计出来的2)仓储里面存放的对象一定是聚合原因是之前提到的领域模型中是以聚合的概念去划分边界的;聚合是我们更新对象的一个边界事实上我们把整个聚合看成是一个整体概念要么一起被取出来要么一起被删除我们永远不会单独对某个聚合内的子对象进行单独查询或做更新操作因此我们只对聚合设计仓储3)仓储还有一个重要的特点就是分为仓储定义部分和仓储实现部分在领域模型中我们定义仓储的接口而在基础设施层实现具体的仓储这样做的原因是:由于仓储背后的实现都是在和数据库打交道但是我们又不期望客户(如应用层)把重点放在如何从数据库获取数据的问题上因为这样做会导致客户(应用层)代码很混乱很可能会因此而忽略了领域模型的存在所以我们需要提供一个简单明了的接口供客户使用确保客户能以最简单的方式获取领域对象从而可以让它专心的不会被什么数据访问代码打扰的情况下协调领域对象完成业务逻辑这种通过接口来隔离封装变化的做法其实很常见由于客户面对的是抽象的接口并不是具体的实现所以我们可以随时替换仓储的真实实现这很有助于我们做单元测试4)尽管仓储可以像集合一样在内存中治理对象但是仓储一般不负责事务处理一般事务处理会交给一个叫"工作单元(Unit Of Work)"的东西这里不准备详细讨论工作单元的工作原理了大家有爱好的可以去研究一下5)另外仓储在设计查询接口时可能还会用到规格模式(Specification Pattern)我见过的最厉害的规格模式应该就是LINQ以及DLINQ查询了一般我们会根据项目中查询的灵活度要求来选择适合的仓储查询接口设计通常情况下只需要定义简单明了的具有固定查询参数的查询接口就可以了只有是在查询条件是动态指定的情况下才可能需要用到Specification等模式设计领域模型的一般步骤:1 根据需求建立一个初步的领域模型识别出一些明显的领域概念以及它们的关联关联可以暂时没有方向但需要有(1:11:NM:N)这些关系;可以用文字精确的没有歧义的描述出每个领域概念的涵义以及包含的主要信息;2 分析主要的软件应用程序功能识别出主要的应用层的类;这样有助于及早发现哪些是应用层的职责哪些是领域层的职责;3 进一步分析领域模型识别出哪些是实体哪些是值对象哪些是领域服务;4 分析关联通过对业务的更深入分析以及各种软件设计原则及性能方面的权衡明确关联的方向或者去掉一些不需要的关联;5 找出聚合边界及聚合根这是一件很有难度的事情;因为你在分析的过程中往往会碰到很多模棱两可的难以清晰判定的挑选问题所以需要我们平时一些分析体会的积存才能找出正确的聚合根;6 为聚合根配备仓储一般情况下是为一个聚合分配一个仓储此时只要设计好仓储的接口即可;7 走查场景确定我们设计的领域模型能够有效地解决业务需求;8 考虑如何创建领域实体或值对象是通过工厂还是直接通过构造函数;9 停下来重构模型寻找模型中觉得有些疑问或者是蹩脚的地方比如摸索一些对象应该通过关联导航得到还是应该从仓储获取聚合设计的是否正确考虑模型的性能怎样等等领域建模是一个不断重构持续完善模型的过程大家会在讨论中将变化的部分反映到模型中从而使模型不断细化并朝正确的方向走领域建模是领域专家、设计人员、开发人员之间沟通交流的过程是大家工作和思考问题的基础领域驱动设计的其他一些主题上面只是涉及到DDD中最基本的内容DDD中还有很多其他重要的内容在上面没有提到如:1 模型上下文、上下文映射、上下文共享;2 如何将分析模式和设计模式运用到DDD中,济公救民特马诗全年;3 一些关于柔性设计的技巧;4 如果保持模型完整性以及持续集成方面的知识;5 如何精炼模型识别核心模型以及通用子领域;6 ..比如Customer实体。