上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 16 下一页
摘要: 在继续实现Apworks框架的过程中,发现一个必须解决的问题,就是分布式事务处理。它要求两个原本相对独立的工作能够在同一个事务上下文中完成处理。如果处理成功,则两者同时提交,否则,两者同时回滚。Apworks框架需要依赖分布式事务来解决二次提交(2PC)的问题,这个在我之前的博客文章中也提到过,简单地说,就是领域事件的存储和发布必须是一个原子操作。在此,我打算使用2-3篇文章的篇幅对.NET下分布式事务处理的实现做个简单的总结,其中并不会涉及到有关分布式事务的原理/理论方面的内容,仅仅是对其实现方式做个记录。首先需要了解到,虽然.NET分布式事务在一定程度上能够解决Apworks框架中2PC的 阅读全文
posted @ 2011-03-15 08:49 dax.net 阅读(10731) 评论(7) 推荐(13) 编辑
摘要: 在对NLayerApp实际项目进行讨论之前,让我们首先学习一下(或者应该说重温一下)分层/多层架构与应用系统设计原则。很多朋友会认为这些都是老掉牙的内容,只要是软件从业人员,都会对这些内容非常熟悉。然而,果真如此吗?我在这里整理这部分内容,一方面是为介绍NLayerApp打下基础,而另一方面,则是希望借此机会将这些理论性的东西做个归纳,也希望读者朋友能够认真阅读,毕竟温故知新嘛。 需要说明的是,从本章节开始,大多数理论性的东西都源自Microsoft Spain团队针对NLayerApp所编写的《Architecture Guide Book》,事实上这本Guideline的英文版至今也还没有 阅读全文
posted @ 2011-03-03 15:15 dax.net 阅读(14043) 评论(18) 推荐(7) 编辑
摘要: 项目简介Microsoft – Spain团队有一个很不错的“面向领域多层分布式项目”案例:Microsoft – Domain Oriented N-Layered .NET 4.0 App Sample(在本系列文章中,我使用NLayerApp作为该项目的名称进行介绍),在codeplex上的地址是:http://microsoftnlayerapp.codeplex.com/。它是学习领域驱动设计(DDD)的一个非常不错的案例项目。该项目采用的是经典的DDD架构,而不是CQRS架构,但我觉得整个案例做的非常不错,基本上包含了基于DDD的架构实践的各个方面。因此,应不少社区朋友的要求,我打 阅读全文
posted @ 2011-03-01 13:21 dax.net 阅读(17801) 评论(13) 推荐(20) 编辑
摘要: 最近在工作上碰到一个性能问题,由于项目是基于SOA的架构,使得整个系统完全依赖于各种各样的Service,其中用于处理业务逻辑的Business Services全部都用.NET Workflow 3.5实现(历史原因,项目还没升级到Workflow 4)。在众多的Business Service中,其中有一个的主要功能是,通过调用不同的Data Service来获取数据,然后根据业务逻辑来组织这些数据并返回给它的调用者。该Business Service的工作流(Workflow)主要包含三个活动组件(Activity),大致可以用下图表示:需要说明一下,在实际项目中,这个Workflow本 阅读全文
posted @ 2011-02-21 09:15 dax.net 阅读(5241) 评论(2) 推荐(5) 编辑
摘要: 启动WCF服务 在TinyLibraryCQRS解决方案下,找到TinyLibrary.Services项目 右键单击CommandService.svc,然后选择View in Browser,这将启动ASP.NET Development Server 当ASP.NET Development Server成功启动,并在浏览器中打开了CommandService.svc后,将出现如下界面 使... 阅读全文
posted @ 2011-02-15 15:12 dax.net 阅读(3374) 评论(7) 推荐(2) 编辑
摘要: Apworks使用配置文件来启动整个系统。在上文中也能够看出,WCF服务在启动时,同时也启动了Apworks系统。所以,本节简要介绍这个WCF服务针对Apworks的相关配置节内容。 双击TinyLibrary.Services项目的web.config文件,根据下面的XML代码编辑该文件。 以上配置文件主要有两个configSection:apworksConfiguration和unityC... 阅读全文
posted @ 2011-02-15 14:27 dax.net 阅读(2968) 评论(6) 推荐(4) 编辑
摘要: 到目前为止,我们还未涉及任何数据库的配置工作。本章节将简单介绍基于Apworks的应用程序的数据库配置。在SQL Server中(目前的Apworks版本仅支持SQL Server)创建两个数据库:TinyLibraryEventDB和TinyLibraryQueryDB,然后分别执行如下SQL脚本:TinyLibraryEventDBTinyLibraryQueryDB由于我们所使用的数据库系统是SQL Server,对于上面的TinyLibraryEventDB而言,它就是直接使用的Apworks应用开发框架中自带的SQL脚本。开发人员可以在Apworks的安装目录中找到该脚本文件。就关系 阅读全文
posted @ 2011-02-14 16:31 dax.net 阅读(2116) 评论(0) 推荐(0) 编辑
摘要: 在本节,我们将介绍.NET WCF服务的创建过程。在Solution Explorer中,右键单击TinyLibraryCQRS,然后选择Add | New Project…菜单,这将打开Add New Project对话框在Installed Templates 选项卡下,选择Visual C# | WCF,然后选择WCF Service Application,确保所选.NET版本为.NET Framework 4,在Name文本框中输入TinyLibrary.Services,然后单击OK按钮右键单击TinyLibrary.Services的References节点,然后选 阅读全文
posted @ 2011-02-14 16:06 dax.net 阅读(4140) 评论(4) 推荐(1) 编辑
摘要: 客户端程序通过命令告知系统“应该做什么”。事实上,这是一种单向的交互过程,客户端程序仅仅向领域模型发送命令请求,它们并不会通过领域模型来查询某些数据信息。在CQRS架构的应用程序中,“查询”是另一部分的内容,这将在接下来的章节中单独讨论。当应用服务器端接收到来自客户端的命令请求后,就会将这些命令推送到命令总线。命令处理器会侦听命令总线,并相应地处理命令请求。现在,让我们在TinyLibraryCQ... 阅读全文
posted @ 2011-02-14 14:51 dax.net 阅读(3936) 评论(0) 推荐(2) 编辑
摘要: 根据wikipedia中关于“事件”的描述,“事件”可以被看成是“状态的一次变化”。例如:当一个客户购买了一台汽车,汽车的状态就从“待售”转变为“已售”。汽车销售系统则把这种状态的改变看成是一次事件的产生、发布、检测以及被更多其它应用程序所使用的过程。对于CQRS架构的应用程序而言,事件产生于领域模型,并由领域模型发布事件同时由领域模型首次捕获并处理,因此,我们称之为领域事件(Domain Events)。在Apworks开发框架中,与领域事件相关的代码都被定义在Apworks.Events命名空间下。请使用下面的步骤为TinyLibraryCQRS解决方案添加领域事件。在 Solution 阅读全文
posted @ 2011-01-26 16:10 dax.net 阅读(5446) 评论(13) 推荐(2) 编辑
摘要: 由于事件溯源(Event Sourcing)的需要,领域事件需要被保存到外部的存储系统中。由于事件本身描述了在特定对象上所发生的事情,因此,为了能够跟踪对象状态的变化过程以获得Event Audit的能力,我们总是将事件的数据保存在存储系统中,而从来不去删除它们。或许你会认为,这样做有点极端,时间长了,存储系统中的数据量将变得非常庞大。遇到这种情况,你需要引入备份和归档策略,而不是直接将过期的数据删除,因为,存储成本是便宜的,但数据却是有价值的。对于一些生命周期比较长的领域对象而言,发生在它们身上的事件数量会随着时间的推移而增大,甚至会变得巨大。于是,通过使用这大量的事件数据来重建领域模型将变 阅读全文
posted @ 2011-01-26 15:08 dax.net 阅读(3631) 评论(7) 推荐(1) 编辑
摘要: 领域模型是应用程序的核心,它包括了领域对象、状态、方法、事件、业务逻辑以及对象之间的关系。现在,我们来为Tiny Library CQRS创建一个领域模型项目。在 Solution Explorer 下,右键单击TinyLibraryCQRS项目,单击 Add | New Project… 菜单,这将打开 Add New Project 对话框 在 Installed Templates 选项卡下,选择 Visual C# | Windows,然后选择 Class Library ,确保所选的Framework版本是.NET Framework 4,在 Name 文本框中,输入TinyLibr 阅读全文
posted @ 2011-01-26 15:07 dax.net 阅读(4111) 评论(2) 推荐(0) 编辑
摘要: 在Apworks框架发布Alpha版本的时候,我已经针对其开发案例:Tiny Library CQRS写了Walkthrough文档,地址是:http://apworks.org/custom/documents/wlkthr_BuildAppsUsingApworks/。为了走国际化道路,这篇文章是全英文的,社区里有不少网友表示难以理解。趁着这几天不算很忙,我抽空将其又翻译回中文,并加入更多的批准内容,供爱好DDD、CQRS和架构设计的朋友阅读参考,也希望大家能够积极参加讨论。简介Apworks是一套应用程序开发框架,软件架构师和开发人员可以使用这套开发框架开发出面向领域(Domain-Ce 阅读全文
posted @ 2011-01-26 15:05 dax.net 阅读(7244) 评论(5) 推荐(3) 编辑
摘要: 今天整理磁盘,发现了我以前在DOS下编写的一些小软件,于是萌发了一种将其发布到博客以表纪念的想法。纯粹是为了回忆和纪念,正如我们会经常回忆那些80后所看的经典动画片、所吃过的零食那样,当我看到这些曾经为之振奋而充满激情的“作品”时,不免会回想起当时写这些软件时的情景,进而感叹:时间过的真快,软件技术发展得真快。这些软件基本上是基于Quick Basic和C/C++编写的,BASIC语言嘛,是我的入... 阅读全文
posted @ 2011-01-19 21:27 dax.net 阅读(6538) 评论(56) 推荐(27) 编辑
摘要: 这个问题来源于Apworks应用开发框架的设计。由于命令与查询职责的分离,使得基于CQRS体系结构风格的应用系统的外部存储系统的结构变得简单起来:在“命令”部分,简单地说,只需要Event Store和Snapshot Store来保存Domain Model;而“查询”部分,则又是基于事件派送与侦听的系统集成。之前我也提到过,“查询”部分由于不牵涉到Domain Model,于是,它的设计应该随... 阅读全文
posted @ 2011-01-19 12:34 dax.net 阅读(10205) 评论(4) 推荐(6) 编辑
摘要: 有不少网友仍然对CQRS与事件溯源(Event Sourcing)不是很了解,对经典的应用系统架构与CQRS架构之间的差别没有一个大概的认识。本文基本上摘自Greg Young的CQRS Documents一文(由daxnet本人翻译并做了简要的注释),希望能够对应用系统架构的爱好者有所帮助。【注:本文主体内容节选并翻译自Greg Young的CQRS Documents。如需查看原文,请单击此处】一、经典的应用系统结构在了解基于领域驱动设计(Domain Driven Design, DDD)的应用系统之前,首先让我们了解一下经典的应用系统结构。这种经典的应用系统结构往往被认定为设计与开发分 阅读全文
posted @ 2011-01-06 19:50 dax.net 阅读(18500) 评论(3) 推荐(8) 编辑
摘要: 领域仓储(Domain Repository)与事件存储(Event Store)是CQRS体系结构应用系统中C部分(Command部分)的重要组件。虽然都是存储机制,但两者有着本质的区别:领域仓储是属于领域层的,而事件仓储则是属于基础结构层的。领域模型产生事件,领域仓储负责保存、发布事件,并通过事件序列重塑领域模型。由于领域仓储的存在,使得“内存领域模型(In-memory Domain)”成为可能。在上文中我已经对对象的状态做了一些介绍,通过这些介绍我们能够了解到,在应用系统中,是领域事件导致了对象状态的变化,于是,我们只需要把这些领域事件按顺序记录下来,我们就有能力将领域模型还原到任何. 阅读全文
posted @ 2011-01-04 19:45 dax.net 阅读(6020) 评论(4) 推荐(2) 编辑
摘要: Tiny Library CQRS的介绍文章有好些日子没有更新了,因为最近一直在忙着发布Apworks应用开发框架。原本打算在2011年1月1日发布,以迎接新年的到来,后来确定了还是在2010年12月31日发布,就算是给过去的一年做个留念。哈哈。一直关注我的博客的园友都知道,之前我的一些领域驱动设计的案例,都是以Apworks为基础的。由于时间关系,Apworks一直没有一个固定的版本,所以在那些案例中,我都是将Apworks的程序集加入了案例的发布包里。现在,终于能够为Apworks整出一个“可用”的版本,并将其发布到了codeplex上,地址是:http://apworks.codeple 阅读全文
posted @ 2010-12-31 10:56 dax.net 阅读(3918) 评论(5) 推荐(3) 编辑
摘要: 从结构上看,tlibcqrs项目并不复杂,但对其进行介绍,的确让我感到有点无从着手。还是先从领域模型中的对象的行为和状态谈起吧。先来谈谈对象状态。据我理解,状态就是一种数据,它用来描述,在某个特定的时间上,这个对象所具有的特质,它将作为对象行为发生的依据和结果。我们平时做设计和编程的时候,尤其是在做数据访问层的时候,特别喜欢一些仅仅包含getter/setter属性的对象,以便调用方能够通过getter获得对象的状态,使用setter设置对象的状态。之前我也说明过,状态并非getter/setter属性,在OOP上,状态表现为“字段”(fields)。现在我们讨论的不是数据访问层的DAO,而是 阅读全文
posted @ 2010-12-22 13:04 dax.net 阅读(4117) 评论(22) 推荐(4) 编辑
摘要: 写在前面也许在阅读了上篇文章中我列出的那部分资料后,还是有很多朋友对领域驱动设计不了解。正如上文评论中有网友提到微软西班牙团队也做了一个面向领域的分布式应用系统架构的案例,地址是http://microsoftnlayerapp.codeplex.com/。在这个站点的首页上,又对领域驱动设计做了诠释,我觉得总结的很好,特地将其翻译成中文写在这里,供大家参考:DDD is much more than this!We're talking about complex apps…, all their business rules (Domain logic) are points th 阅读全文
posted @ 2010-12-15 10:29 dax.net 阅读(6246) 评论(13) 推荐(4) 编辑
上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 16 下一页