首页 文章 精选 留言 我的

精选列表

搜索[AI驱动],共10000篇文章
优秀的个人博客,低调大师

IDDD 实现领域驱动设计-一个简单的 CQRS 示例

学习架构知识,需要有一些功底和经验,要不然你会和我一样吃力,CQRS、EDA、ES、Saga 等等,这些是实践 DDD 所必不可少的架构,所以,如果你不懂这些,是很难看懂上篇所提到的 CQRS Journey 和 ENode 项目,那怎么办呢?我们可以从简单的 Demo 一点一滴开始。 代码地址:https://github.com/yuezhongxin/CQRS.Sample 说明:一张很丑陋的图 CQRS.Sample 所描述的一个流程是 SendMessage(发消息),也就是之前 MessageManager 中的一个业务示例,这个业务流程用到 CQRS 示例中,可能会有些不太准确,或者是有些牵强,但我主要的目的是想做一次 Commond->Event 的过程,熟悉它们到底是怎么交互的?所以,你查看代码的时候,尽量忽略这个业务流程,当然,如果你有针对这个业务流程更好的具体应用,我是非常欢迎交流。 首先,我们根据上面的流程图一步一步进行,UI 创建一个 Commond,然后交给 CommandBus 进行 Send(发送),也就是下面这段代码: var commond = new SendMessageCommond() { Title = "this is title", Content = "this is content", SenderLoginName = "this is senderLoginName", RecipientDisplayName = "this is recipientDisplayName" }; var commandBus = IocContainer.Default.Resolve<CommandBus>(); commandBus.Send(commond); 项目中所有的类型映射都是通过 IoC 进行注入,ICommandBus 接口定义为:void Send<TCommand>(TCommand cmd) where TCommand : ICommand;,CommandBus 的实现主要是在 Send 方法中,解析ICommandHandler<TCommand>注入的类型对象,然后调用 ICommandHandler 接口定义的 Handle 方法,传入 TCommand 参数对象。 SendMessageCommond 的定义很简单,主要是一些来自 UI 的参数,所以,我们一般会定义一些属性字段,有时候我们会进行数据验证,可以使用 Validate,方法签名是:IEnumerable<ValidationResult> Validate(ValidationContext validationContext),不过需要继承 IValidatableObject 接口,这样我们就可以在 MVC View 前端进行输出验证结果,使用起来非常方便,SendMessageCommond 继承一个无实现的 ICommand 接口,主要用来约束类型,SendMessageCommond 对应 SendMessageCommondHandler,实现代码: public class SendMessageCommondHandler : ICommandHandler<SendMessageCommond> { public void Handle(SendMessageCommond command) { var sender = VerifySenderService.Verify(command.SenderLoginName); var receiver = VerifyReceiverService.Verify(command.RecipientDisplayName); var message = new Message(command.Title, command.Content, sender, receiver); message.Send(); } } CommondHandler 的功能有点类似于经典分层架构中的 Application(应用层),从它的具体实现中,我们就可以看出领域到底在做哪些工作,它的主要工作就是协调这些工作的流程,领域中的代码我就不贴了,这里我简单说明一下,在之前的 SendMessage 实现中,设计了一个 SendMessageService 领域服务,里面主要进行的工作是验证收发件人,以及消息是否符合规则,后来我就想,SendMessageService 和它实际进行的工作不相符,发消息所蕴含的实际业务意义,我也一直没有想明白,但是在具体实现中,发消息所做的工作是验证,那验证是不是发消息真正的业务含义呢?所以,稀里糊涂就有了上面的代码,VerifySenderService 和 VerifyReceiverService 是用来验证收发件人信息的,成功的话就返回一个 Contact 对象,具体的验证逻辑可以查看下实现代码。 下面说一下message.Send();,这个可能有很大的问题,在 CQRS Journey 项目中,有很多类似于这样的操作,就是在 CommondHandler 中,创建一个聚合根对象,然后执行聚合根中的一个行为,比如我搜刮的order.Confirm(),订单可以提交自己吗?消息可以发送自己吗?这样做的含义是什么?其实我也搞不太清楚,在 Message 聚合根中的 Send 方法中,主要是事件的发布, public void Send() { eventBus.Publish(new MessageSentEvent(this)); } 先抛开 Send 的合理性,看下 EventBus 是如何 Publish 的?我的实现中和 CommondBus 很相似,但我觉得可能有些问题,Commond 和 CommondHandler 是一一对应关系,我们知道事件发布和事件订阅是一对多关系,也就是说一个事件可能有很对的订阅者,这些订阅者所处理的过程可能会有些不同,比如用户注册的一个事件,可能会有邮件通知订阅者,也可能会有统计数据更新订阅者,在 CQRS Journey 项目中,EventBus 的 Publish 大概是这样实现的: public void Publish(Envelope<IEvent> @event) { var message = this.BuildMessage(@event); this.sender.Send(message); } private Message BuildMessage(Envelope<IEvent> @event) { using (var payloadWriter = new StringWriter()) { this.serializer.Serialize(payloadWriter, @event.Body); return new Message(payloadWriter.ToString(), correlationId: @event.CorrelationId); } } 而我的实现则是和 CommondBus 一样,都是用 IoC 注入的,所以肯定有问题,我们来看下 MessageSentEventHandler 中的代码: public class MessageSentEventHandler : IEventHandler<MessageSentEvent>, IEventHandler<MailSentEvent> { private IEventBus eventBus; public void Handle(MessageSentEvent @event) { eventBus = IocContainer.Default.Resolve<IEventBus>(); new MessageRepository().Save<Message>(@event.Message); eventBus.Publish(new MailSentEvent { Title = @event.Message.Title, Content = @event.Message.Title, }); } public void Handle(MailSentEvent @event) { var mailMessage = new System.Net.Mail.MailMessage(); mailMessage.Subject = @event.Title; mailMessage.Body = @event.Content; mailMessage.IsBodyHtml = true; mailMessage.BodyEncoding = System.Text.Encoding.UTF8; mailMessage.Priority = System.Net.Mail.MailPriority.Normal; System.Net.Mail.SmtpClient smtpClient = new System.Net.Mail.SmtpClient(); Task.Run(() => { smtpClient.SendAsync(mailMessage, mailMessage.Body); }); } } 消息发送之后,进行持久化操作,然后再进行邮件通知,这样一整个 SendMessage 的流程就走完了。 这个流程中,只有 CQRS 的 Commond,并没有 Query,也没有 ES、Saga 的概念,主要是它们太深奥了,我搞不来。CQRS.Sample 只是一个简单的示例,发消息的业务含义所表达的可能不是很准确,本来是想用用户注册、订单提交业务示例,但还是想想用发消息进行尝试下,除去 EventBus 的实现有问题,CQRS 的简化版基本上都能表现出来了。 另外,从简单分层架构改造成 CQRS 确实有很多挑战,但有时候想想,领域模型都设计的有问题,那用什么架构实现都毫无意义,如果在现有的项目中,你发现经典分层架构实现起来有很多别扭的地方,比如 Domain 引用了 DTO,你可以尝试先把 Repositories 进行分离下,创建一个 Query 项目,把一些无业务逻辑的查询发到里面(主要是应用层调用的),这样使 Repositories 更加简化,如果可以简化成只有一个 GetById 方法,那么就达到 CQRS 的标准了,因为 Repositories 的接口定义在领域层,因为 Query 项目的分离,所以,Domain 就可以去除 DTO 的引用了,应用层也就直接调用 Query,这只是一个中和方案。 领域模型需要一点一滴设计,架构也需要一点一滴设计,但后者需要建立在前者的基础上。 一个对我非常有帮助的 CQRS 系列(初级): CQRS实践(1): 什么是CQRS CQRS实践(2): Command的实现 CQRS实践(3): Command执行结果的返回 CQRS实践(4): 领域事件 本文转自田园里的蟋蟀博客园博客,原文链接:http://www.cnblogs.com/xishuai/p/iddd-cqrs-samlpe.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

华为服务器的执着:创新驱动做最好的产品

2015年,华为服务器产品在日本的发货量增长令很多人感到意外,这个数字是379%,高于华为服务器在任何其他区域的增长数字。 华为IT服务器产品线总裁邱隆 在近日的华为服务器媒体沟通会上,华为IT服务器产品线总裁邱隆将它解释为,“日本客户对品质的要求非常高,这一点和华为做产品的态度非常吻合。” 也许正是因为对“品质”的追求,华为服务器的过去一年正是高歌猛进的一年,目前,华为服务器全球发货量第四,4P多路服务器增长率全球第二,模块化服务器全球第三,增长率全球第一。 华为对品质的追求甚至有点“一根筋”,两年前,竞争对手给了华为非常大的压力,尤其在互联网领域市场。甚至有人向邱隆建言,“你能不能做一个差一点的服务器、做最便宜的服务器,先去占领市场!”最后,他们顶住压力没有做,在华为的眼里,质量就是红线。邱隆说,令他骄傲的是,做服务器这么多年,从没有出现过一次批量事故。 也许真是这种执着,除了在日本,华为服务器在西欧、北美、拉美的发货量均增长迅速,邱隆表示,“通过多年的努力,我们已经把我们的品牌建立起来了。” 根据Gartner报告,截止2016年第一季度,华为服务器出货量连续十一个月出货量全球第四,市场地位稳固提升。不过,华为对于第四的位置显然并没有满足,邱隆半开玩笑地说,十几年前,华为在接入网市场冲到全球第四名,但市场排名二、三名的厂商突然合并,似乎面前出现一道屏障,无法向前迈进,不过几年之后,华为最终成为全球接入网市场第一名。 言下之意,华为还要做服务器市场的第三名、第二名甚至第一名,况且,现在的难度并不高于当时的接入网。 当下,华为市场地位的提升不仅体现在其发货量上,还体现在专业影响力上,在2016年Gartner发布的服务器魔力四象限中,华为进入挑战者象限,这体现了华为服务器强有力的上升态势和业界认可度。没进入领导者象限,很重要的原因华为服务器在美国的客户群还不足够多,邱隆相信,随着华为服务器在美国加大拓展,进入领导者不会是太远的事情。 华为有一个传统,一旦进入任何一个领域,投入都会很大,这个过程中行业一旦发生变化,就意味着有市场机会。邱隆认为,现在这个机会来了! “全面云化,核心业务从封闭走向开放,私有云兴起,公有云在规模效应的带动下追求极致性价比。”服务器行业已经打破过去多年的稳定,加剧创新和变革。 为此,华为服务器持续大规模投入,加快产业创新,目前已经形成了面向私有云、公有云、运营商转型的广泛产业线。包括超融合、重构云基础设施FusionCube,创新、加速计算的FusionServer,引领SSD走向NVMe时代的TaiShan,支撑关键业务从封闭到开放的KunLun。 华为KunLun开放架构小型机凭借开放生态、创新的RAS2.0可靠性和极致性能,可以帮助用户把关键业务从封闭平台部署到开放计算平台上,从而保护投资。华为FusionCube超融合基础设施则凭借深度融合分布式存储、支持混合部署、SSD加速、高速网络等特性,重构云基础设施,帮助用户实现IT转型,快速上云。FusionServer和TaiShan凭借高质量及一系列基础创新,给计算加速,从而在公有云应用中展示出自己的独特客户价值。 它们形成了云计算的最佳载体。 华为服务器围绕客户使用场景从底层芯片、整体架构、工程设计和上层解决方案全面持续创新,满足客户当前和未来的计算基础设施需求。 邱隆强调,“华为服务器很简单,就是做客户心中最好的产品!” 原文发布时间为:2016年9月14日 本文作者:陈广成 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册