随笔分类 -  设计单元

平时写的代码。 一个一个的小“模块”吧。
摘要:对于业务逻辑的组织,个人认为,最好是使用 DDD(《Domain Driven Design》) 的方式。DDD 使用领域模型来表达实体间的关系,同时在应用层使用 Service 来组织各实体间的过程式代码。二者构成了整个应用程序的核心业务逻辑(《Pattern of Enterprise Application Architecture》)。OEA 是一个基于 DDD 思想的框架。在 OEA 中,使用了 Service、Controller 来组织过程式逻辑。结构如下图: 对于大型系统来说,OEA 中的 Service 主要作为分布式调用、本地调用的 Facade 接口,主要的业务过程则使用 阅读全文
posted @ 2013-03-08 11:46 BloodyAngel 阅读(640) 评论(0) 推荐(0) 编辑
摘要:本篇博客主要描述分页的常见技术方案,以及在 OEA 框架中的分页的应用及实现原理。分页的几种方案 分页是解决大数据量显示的有效方法。根据分页技术应用的位置不同,大致可以把分页分为以下几种:界面层分页 界面层的分页,类似于界面的虚拟化技术,是只显示需要的数据的一种技术。OEA 的 WPF 界面中目前已经实现了 UI 虚拟化,所以不再实现界面层分页。优点:* 简单。许多控件都支持在界面层直接进行分页。* 换页时,响应快。(在 C/S 结构下使用这种方案,数据都已经到达客户端,所以在分页时不需要额外的数据查询,响应速度较快。)缺点:* 不用于太大的数据分页。由于没有减少网络传输,首次加载时较慢,需. 阅读全文
posted @ 2013-01-23 17:50 BloodyAngel 阅读(2030) 评论(11) 推荐(3) 编辑
摘要:本篇博客主要描述在 OEA 框架中的多国语言框架的原理及应用。多国语言常见实现及原理分析 管理软件平台,一般来说,都应该支持多国语言,以支持应用程序走向国际化。OEA 最近也提供了多国语言框架,它可以在修改少量甚至不修改代码的情况下,快速、灵活地,使得整个应用软件支持各个国家的语言。在 .NET 平台上,要实现多国语言切换,一般可以使用资源文件实现;在WPF中,也可以使用动态引用实现。这些可以参考以下几篇文章中讲到的方法:《WP7多国语言支持》、《一种灵活的WPF程序多国语言支持》、《.NET多国语言支持》。 而这些方法背后的本质,其实都是在开发期,通过开发人员定义的“键(Key)”,找到在. 阅读全文
posted @ 2012-12-30 22:13 BloodyAngel 阅读(1355) 评论(2) 推荐(2) 编辑
摘要:为什么要重构 上两个月主要做了一件事情,那就是把 OEA 框架中的 TreeGrid 控件,从结构上重新设计,并大量重构现有代码。而花较大精力做这件事的原因,主要是因为: 业务中需要支持一系列新功能:整行编辑、上下箭头键进行导航、合计行、锁定列 等。 控件显示性能较差,需要支持列虚拟化。 和 OEA 元数据系统耦合,希望独立为单独的控件程序集,提高复用性。 不支持 xaml 声明的格式。原控件直接在后台用 OEA 代码生成,本质上作为一个 WinForm 控件来用。 整个 TreeGrid 控件混合了三个控件代码而成,包括:GridView... 阅读全文
posted @ 2012-11-14 16:20 BloodyAngel 阅读(2357) 评论(7) 推荐(2) 编辑
摘要:最近用 OEA 做的仓库管理系统中,许多界面的都需要使用表格控件来显示数据。一是这些表格的列非常多,有的甚至达到了 200 列,而且一个模块的界面中可能同时显示好几个表格。这导致界面的速度比较慢,特别是较多数据需要展现时。经检测,表现虽然表格的行已经做了虚拟化,但是由于列非常多,最终还是造成可视树中的元素过多,而导致界面布局代码运行过慢。假设只有 30 行,一个单元格仅生成 5 个可视元素,200 列的单元格都会产生 3W 个可视元素,而布局系统的 Measure 方法需要对可视树中的每一个元素都调用其对应的 Measure 方法,可以想象,这当然会很慢。 那么,要解决上述的问题,只有... 阅读全文
posted @ 2012-10-24 15:53 BloodyAngel 阅读(4868) 评论(2) 推荐(2) 编辑
摘要:之前 OEA 一直用着一个 Delphi 开发的报表,所以两年来我一直就想在 OEA 中构建一个纯 .NET 的报表模块,但是一想到要开发复杂的报表引擎和设计器就觉得麻烦。所以这事一直拖着。最近开始研究一些成熟的报表引擎,经过对比,还是发现微软的 RLDC 报表已经能满足我大多数需求。其中包括表格、矩阵、图表 等复杂控件,同时同样的报表格式在 B/S 模式下也可以直接使用,最新的 Tablix 控件非常灵活,能实现大多数表格样式。所以我决定不再费时费力去造一个轮子,而是直接把微软的 RDLC 报表集成进来。最终集成到 OEA 中,只花了不到一周的时间。虽然现在还处在第一版,没有给客户使用的设计 阅读全文
posted @ 2012-09-07 16:15 BloodyAngel 阅读(2679) 评论(9) 推荐(2) 编辑
摘要:OEA 框架提供了多种方式来优化分布式数据查询的性能,本篇将会说明如何以声明 OEA 冗余属性的方式,来实现轻量级的数据冗余,以减少关联查询次数及网络数据传输量,提高分布式应用程序性能。 冗余属性功能说明 OEA 冗余属性在框架层面提供了一种易用的机制,把指定冗余路径的关系对象中的属性值复制到本对象中,以解决关联查询、关联数据量等性能问题。应用开发人员只需要简单的定义一个冗余属性,而... 阅读全文
posted @ 2012-08-10 20:37 BloodyAngel 阅读(2015) 评论(2) 推荐(1) 编辑
摘要:简要说明 OEA 1.0-2.0 框架中,界面都是以 WPF 技术作为基础平台开发的。我们需要对开发出来的系统进行自动化测试,而 .NET 平台的自动化测试平台在公司内部还没有其它部门完成,所以我们在 2010 年的时候使用 Ruby + VS UIUnitTest 开发了一个 UI 自动化(UI 阅读全文
posted @ 2012-02-14 16:33 BloodyAngel 阅读(9639) 评论(8) 推荐(4) 编辑
摘要:11年11月我主要对 OEA 框架中 WPF 自动界面生成模块中多类型树型表格控件进行重构,并同时支持更多的功能。这样,整个 OEA 就不再使用 DataGrid,结束了 DataGrid 与树型表格控件混用的情况。 树型表格、一般表格统一为一个控件: 另外,附上对重构前的控件类结构设计分析图: 阅读全文
posted @ 2012-01-19 15:24 BloodyAngel 阅读(547) 评论(0) 推荐(1) 编辑
摘要:这篇设计文档是 12 月份写来参加公司的研发峰会的,自己倒是信心满满,不过最后还是没有入围。现在想想也没啥大用,所以贴出来,期待与园友交流。 文档有点长,没全部贴在博客中,有兴趣的可以下载附件中的 PDF。附件:《实体扩展属性系统-系统设计说明书.pdf》================= 分隔线 ======================目录 前言... 4 1 背景与需求... 5 1.1 产品 721 客户化开发的需要... 5 1.2 实体动态列... 6 1.3 分离只读/视图属性... 6 1.4 提升框架性能... 6 1.5 支持 WPF 绑定... 6 1.6 其它需求.. 阅读全文
posted @ 2012-01-11 21:10 BloodyAngel 阅读(5382) 评论(8) 推荐(4) 编辑
摘要:时间有限,简单快速的完成本篇博客……(很多问题在此就不细说清楚了,主要还是记录一下成果。) * 先是整个子系统要完成的需求列表: * 然后是对它的分析,以及整个逻辑方案的结构。 图中的“概要”部分同时说明了静态结构和运行时时期的划分。 * 以及,这样的结构,如何实现整个需求的描述: * 逻辑方案中的静态结构,主要还是看以下的类图设计: 第一张,自然是托管属性本身的结构设计。当时只考虑了编译期属性的实现,后来添加了运行时属性的实现。二者实现方案不同,前者使用数据,后者使用哈希表,主要是为了性能及动态之间的权衡。 使用托管属性的... 阅读全文
posted @ 2011-10-30 11:47 BloodyAngel 阅读(837) 评论(0) 推荐(1) 编辑
摘要:OEA 将会使用最新的扩展属性系统来编写实体类,而这些实体类需要绑定到WPF界面上。那么,扩展属性如何支持绑定呢?下面的图是分析在 WPF 中如何支持 DataTable 的动态列绑定。之后的 OEA 扩展属性系统中,会做出类似的设计,以支持绑定扩展属性。 图1 WPF 中 DataTable 支持绑定的核心类分析 图2 WPF 中为 DataTable 生成视图模型的流程图 阅读全文
posted @ 2011-10-30 11:28 BloodyAngel 阅读(707) 评论(0) 推荐(0) 编辑
摘要:本篇博客依然用于总结工作中遇到的较有用的设计模式。 入正题。 历史代码 我目前开发的系统中,要实现以模块的方式进行动态扩展。这些模块是以独立程序集的方式嵌入到系统中。原系统中,使用了一个简单的接口 IModule 来实现模块的初始化:public interface IModule{ void Initialize();}这样,在应用程序初始化时,会检测指定目录 Modules 下的所有程序集,并对其中所有实现 IModule 接口的类型进行初始化调用:public partial class App : Application{ protected override... 阅读全文
posted @ 2011-02-22 11:03 BloodyAngel 阅读(2837) 评论(11) 推荐(13) 编辑
摘要:本文记录对某网站A的秒杀活动编写秒杀器的经历和技术重点。 故事回顾 某日早上,朋友给我说最近A网站在开展秒杀活动,有IPad、IPhone,让大家一起去秒杀。结果我们四个人一起秒,都没有别人快,没有一个人秒到。然后下午我就开始尝试分析它网站的秒杀流程,并尝试使用自动提交数据的方案来进行秒杀。结果,在晚上的时候,成功做出了第一个版本的秒杀器,然后我们一起秒杀了几个IPad(大家都想要IPad,而对... 阅读全文
posted @ 2011-01-07 23:13 BloodyAngel 阅读(10972) 评论(10) 推荐(6) 编辑
摘要:之前写过几篇关于聚合对象SQL的文章,讲的是如果设计框架,使用一句SQL语句来加载整个聚合对象树中的所有数据。相关内容,参见:《性能优化总结(二):聚合SQL》、《性能优化总结(三):聚合SQL在GIX4中的应用》。由于没有使用其它的ORM框架,当时项目组决定做聚合SQL,主要是为了减少SQL查询的次数,来提升部分模块的性能。现在看来,当时虽然达到了这个目标,但是聚合SQL的API却不简单,使用极为不便。至今,项目组中的其它人也不会使用。所以,这次我们决定把聚合SQL的API使用再次进行封装,以达到使用起来更简便的效果。 本文中的内容与前面几篇的内容、与OEA框架中的内容相关性比较大,有兴趣的 阅读全文
posted @ 2011-01-07 16:48 BloodyAngel 阅读(1702) 评论(2) 推荐(2) 编辑
摘要:上篇文章《OEA中的AutoUI重构(2)- 评审会议前的总体设计》写了在“OEA框架”中进行AutoUI模块重构的设计方案。最近项目组已经召开了评审会议,并对该设计进行了审核、建议。本篇文章主要记录其中一些主要的改动。 设计改动 大家认为 AggregateBlocks 和 BlockDefinition 的设计过于复杂,不易于理解。考虑的东西太多,有过度设计之嫌,所以这一处的设计改为使用Composite模式来组合“UI块”: 另外,上次的设计中,有一个小错误:不应该把元模型的仓储 UIInfoRepository 放在单个的界面组成单元中,而是应该放在更上层的整个界面的元模型层。 相应 阅读全文
posted @ 2010-12-20 17:58 BloodyAngel 阅读(544) 评论(1) 推荐(2) 编辑
摘要:之前已经写了一篇关于其中Command模块的重构:《OEA中AutoUI重构(1) - Command自动生成》。Command自动生成的重构作为本次重构的一个“前锋战”,尝试用OO的方式把原来的过程式的界面自动生成流程进行优化,以支持更好的可扩展性。Command自动生成较为独立,所以就单独先进行了重构,目前重构已经完成,效果较好:和原有系统完成兼容,同时插入了更多必需的扩展点。 本次重构主要... 阅读全文
posted @ 2010-12-17 15:17 BloodyAngel 阅读(1445) 评论(1) 推荐(3) 编辑
摘要:OEA框架的核心之一是AutoUI,其职责是面向领域模型及UI元模型进行生成统一的界面。 在本次的迭代开发中,需要对命令按钮的生成方式进行一些定制。由于原来并没有为这样的需求留有特别的扩展点,加之原来的生成代码是过程式的代码、且也变得比较冗长,所以我们决定对这一部分的代码进行重构。 原来的模式 历史代码中,为某一实体类生成命令按钮的流程是这样的: 找到实体类可用的所有命令按钮元数据。 对它们进行过滤,依靠权限、版本的客户化元信息等。 构造几个生成控件的List容器,分别是:itemsInToolbar,itemsInContextMenu,itemsInGroup。 遍历所有的命令按钮,根据. 阅读全文
posted @ 2010-12-10 16:19 BloodyAngel 阅读(1800) 评论(0) 推荐(3) 编辑
摘要:本篇博客简单描述了Repository模式在OEA中的应用。 不使用Repository时的问题 OEA框架中使用了DDD的思想,面向领域对象进行开发。在DDD中,有很多重要的概念,例如:聚合实体对象、值对象、仓储、工厂、服务等。(不太了解的Repository和DDD的朋友,可以看Evans写的《Domain Driven Design》。) 在OEA中,实体的实现框架使用了CSLA分布式框架。原来为了简单并保持和CSLA开发模式的兼容,一直都把实体的获取模式直接以静态方法的方式直接写在实体的对应列表类中。例如下面这段代码: 随着应用的慢慢深入,出现了一些问题: 不易支持客户化。OEA 阅读全文
posted @ 2010-12-09 11:17 BloodyAngel 阅读(2215) 评论(2) 推荐(5) 编辑
摘要:项目组目前开发的基于OEA框架的GIX4项目,本次功能已经完成得差不多了,本次迭代的目标主要是提升产品的性能。由于GIX4是C/S结构的应用程序,所以决定实现缓存模块来提升高繁数据访问的缓存。 本篇文章主要介绍了OEA框架中的缓存模块设计与一般的缓存有什么不同,如何在OEA框架中实现缓存模块。分为以下几个小节: 一般缓存介绍 OEA缓存目标 概要设计 通用缓存框架的详细设计 OEA中集成Cache的详细设计 小结 一般缓存介绍 网上介绍缓存的文章比较多,在这里我就挑点重点说一下。 缓存是信息系统软件硬件设计中常用的设计方法:从底层硬件的CPU结构中的多级缓存,到软件中操作系统中内存 阅读全文
posted @ 2010-11-29 15:02 BloodyAngel 阅读(2800) 评论(3) 推荐(8) 编辑