随笔分类 -  工作相关

工作中遇到的一些问题。
摘要:现象 这个月我的工作任务中,有一项是重构OEA框架中的AutoUI部分。这个任务在月初时计划在一个月内完成,包括问题分析、设计新的结构、编写设计文档、开展设计评审、代码实现。原计划半天到一天的评审会议,最后花费了大概一天半的时间。接下来,我就评审会议中出现的问题进行一下总结。 本次AutoUI设计是我到公司以来,觉得最有挑战的一次工作。 会议之前,我和组内的人员进行了多次沟通,了解他们的需求:我们的AutoUI框架当前有些什么问题?当界面需求被提出后,我们对它的完成情况怎么样?开发人员对AutoUI有什么期望?测试、需求人员对AutoUI有什么期望?布局有什么问题?期望的GIX4界面是什么 阅读全文
posted @ 2010-12-14 16:39 BloodyAngel 阅读(964) 评论(3) 推荐(2) 编辑
摘要:OEA框架的核心之一是AutoUI,其职责是面向领域模型及UI元模型进行生成统一的界面。 在本次的迭代开发中,需要对命令按钮的生成方式进行一些定制。由于原来并没有为这样的需求留有特别的扩展点,加之原来的生成代码是过程式的代码、且也变得比较冗长,所以我们决定对这一部分的代码进行重构。 原来的模式 历史代码中,为某一实体类生成命令按钮的流程是这样的: 找到实体类可用的所有命令按钮元数据。 对它们进行过滤,依靠权限、版本的客户化元信息等。 构造几个生成控件的List容器,分别是:itemsInToolbar,itemsInContextMenu,itemsInGroup。 遍历所有的命令按钮,根据. 阅读全文
posted @ 2010-12-10 16:19 BloodyAngel 阅读(1797) 评论(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 阅读(2798) 评论(3) 推荐(8) 编辑
摘要:前两天在另外一个部门学习了他们的系统架构和框架。下面是自己在张上画的结构图: 阅读全文
posted @ 2010-11-09 11:47 BloodyAngel 阅读(561) 评论(1) 推荐(1) 编辑
摘要:本篇主要描述GIX4项目中如何把单独的模块设计为一个“插件”,如何把它组装到系统中。至于为什么加引号,之后会有说明。 原理 在基于产品线开发时,7,2,1的产品功能分类中,20%的功能是需要在产品线主干中包含进来的。这些功能一般会被设计为“可选包”。在某一客户版本产品的装配阶段,在“可选包”集合中挑选需要的功能,进行组装,得到最终的产品。具体内容,见:《软件产品线工程方法:如何在OpenExpressApp做客户化工作》。 在基于OpenExpressApp框架的GIX4项目中,“合同”模块就是属于这20%的功能,它被设计为独立的DLL,在产品装配时为需要的客户进行装配。 DLL间的关系 项. 阅读全文
posted @ 2010-09-28 10:11 BloodyAngel 阅读(2148) 评论(4) 推荐(4) 编辑
摘要:上篇 已经就客户化的整体方案进行了叙述,这次主要是说明一些细节部分的设计。 类型的视图元数据 基于OEA框架的GIX4项目中,客户化工作主要是对各客户版本中类型的视图信息进行定义。下图是包含这些类型的类图: 图1 客户化API中的类型视图元数据 属性继承 在应用程序定义中,需要支持继承类型的视图信息定义,也就是说,在基类上定义的视图信息,子类在没有定义的情况下,直接使用基类的定义;当然,也可以为具体的子类做特殊的定义。 但是,TypeViewInfo是某一个实体类型的视图信息,它只对应唯一一个Type。所以要支持继承定义,需要做一些特殊的处理。 一种方案是为所有TypeViewInfo建立父. 阅读全文
posted @ 2010-09-26 10:32 BloodyAngel 阅读(1946) 评论(0) 推荐(3) 编辑
摘要:这篇文章还是对工作内容的总结,主要是总结一下这几天做的产品的客户化工作内容。 关于产品线工程中客户化的理论知识和概念,请见金根的《产品线工程》。具体的,OEA框架中的客户化理论,见:《软件产品线工程方法:如何在OpenExpressApp做客户化工作》。 本文主要从以下几个方面来叙述如何在OEA框架中设计和实现客户化框架: OEA客户化框架设计目标 方案设计 具体实现 设计目标 支持实体类的扩展。 支持实体扩展包的动态加载。 支持界面扩展及界面扩展包的动态加载。 各版本间自定义界面元素,可以基于现有的特定版本修改一些内容。 各版本间支持自定义内容文件,如果没有使用,则使用默认版本的内容文件。. 阅读全文
posted @ 2010-09-20 20:37 BloodyAngel 阅读(2786) 评论(5) 推荐(4) 编辑
摘要:最近,GIX4项目需要开展客户化工作。同时,下一期sprint中,客户还要求大幅度提升产品的性能。针对所存在的问题,开发人员决定开一系列的技术讨论会。 我总结了目前遇到的和可能遇到的问题:客户化: 实体类客户化 各客户对同一产品表现出的需求,要求实体类在一定程序上各不相同。这就需要领域模型做到可以客户化。 界面客户化 需求不同,界面自然也需要客户化。这是一般性需求。性能: 实体类优化 目前系统使用的是基于CSLA对象模型的实体类。由于使用了CSLA托管属性,性能比较差。同时,由于一个聚合类往往通过多个多层的实体类聚合而成,调试时却都是在调试CSLA的基类,基类中为所有实体类使用同一种模式进行. 阅读全文
posted @ 2010-08-30 20:31 BloodyAngel 阅读(624) 评论(0) 推荐(3) 编辑
摘要:问题描述 今天测试人员提了一个易用性的BUG,主要是说系统目前使用的树型控件不支持自动扩张列的宽度。其实客户那边已经对这个问题提了多次,不过由于对WPF只是入门级,所以一直都没改。这两天项目比较闲,就花了些时间把这个问题改了。原问题如下: 图1 问题描述 背景 树型控件在GIX4系统中已经被大量使用。这个控件是一年前其它同事在网上搜索到,再引入的。 一开始的时候,要解决这个问题,想到的最... 阅读全文
posted @ 2010-08-05 17:58 BloodyAngel 阅读(4338) 评论(6) 推荐(7) 编辑
摘要:前面已经把原理都讲了一遍,这篇主要是给出一个应用的实例。该实例取自GIX4,比较复杂。 领域模型: 领域模型间的关系,如下: 右边模型链的具体关系在《第二篇》中已经描述过,不再赘述。 本次重点在于红线框住部分: Project:表示一个建设项目; ProjectPBS:一个项目下包含的很多PBS; PBSPropertyValue:一个PBS我们可以为它设置多个值,每一个值对应一个PBSType(模板)中已定义的属性,值的范围也是只能在属性中已定义的可选值中进行选择。 对应的UI如下: 聚合SQL应用: 首先,从应用来考虑:当用户到这个界面时,首先显示的是左边那个Project(项目)的列表. 阅读全文
posted @ 2010-07-07 18:11 BloodyAngel 阅读(2937) 评论(0) 推荐(4) 编辑
摘要:前篇说到了使用异步线程来实现数据的预加载,以提高系统性能。 这样的操作一般是在客户端执行,用以减少用户的等待时间。客户端发送多次异步请求,到达服务端后,如果服务端不支持多线程处理操作,线性处理各个请求,必然导致客户端的异步请求变得没有意义。 大家肯定会说,谁会把服务端设计成单线程的啊,那不是明显的错误吗?是的!但是我们的系统使用了CSLA来作为实现分布式的框架,而它的服务端程序却只能支持单线程……这个问题我们一直想解决,但是查过CSLA官方论坛,作者说由于GlobalContext和ClientContext的一些原因,暂时不支持多线程。火大,这还怎么用啊!无奈目前系统已经极大地依赖了这个框. 阅读全文
posted @ 2010-07-01 15:45 BloodyAngel 阅读(4251) 评论(7) 推荐(4) 编辑
摘要:本节说一下数据的预加载。这节的内容与SQL没什么关系。主要说的是在 GIX4项目 中,我们是如何设计符合需求的预加载类库的。内容如下: 什么是预加载,为什么要用它? 我们所需要的API 一个简单的例子 什么是预加载? 预加载其实就是在真正开始使用数据之前,先异步把数据加载好,等到需要使用时,就可以直接使用之前加载好的数据。这时,由于数据已经加载完成,而不用等待漫长的加载过程,所以程序的速度得到一个明显的提升。 那么,什么时候需要使用它呢?我觉得,主要是这种情况:当我们可以预知程序接下来的步骤中,很可能会用到一些数据,而获取这些数据的操作比较耗时的时候,我们就可以使用预加载的方式,提前把数据准. 阅读全文
posted @ 2010-06-30 20:30 BloodyAngel 阅读(3726) 评论(2) 推荐(6) 编辑
摘要:本节主要介绍,在GIX4系统中,如何应用上篇讲的方案来改善性能,如果与现有的系统环境集成在一起。大致包含以下内容:SQL的生成映射-数据读取方案工厂方法-接口的命名约定实例代码SQL生成 GIX4系统中的所有领域模型及分布式访问机制,使用CSLA作为底层框架。而ORM机制,使用了一个非常轻量级的开源代码LiteORM实现。模型类的定义,采用以下的格式: 可以看到,在类的元数据定义中(这里目前使用的是Attribute的形式),已经包含了对应数据表和列的信息。所以为SQL的自动化自成提供了一定的支持。 其实,由于目前对性能要求比较高的模块少,所以用于优化查询的SQL主要还是依靠人工手写。但是 阅读全文
posted @ 2010-06-25 18:44 BloodyAngel 阅读(1898) 评论(0) 推荐(2) 编辑
摘要:本篇主要讲如何使用一句较复杂的SQL来加载整个聚合对象,以达到最小化数据库连接次数。主要是解释其中的原理。 LazyLoad及其缺点 相信越来越多的人已经开始使用富领域对象进行领域/业务层的实现了。而目前主流的数据库依然还是关系型的。这中间的转换,我们叫它ORM。ORM的设计中,有一个常用的模式叫作“延迟加载(LazyLoad)”。基设计思想大致上是说,不要把所有的数据都加载进内存,而是等到真正要使用数据的时候,再把它加载进内存。 例如以下这个聚合对象: (为了和后面的代码保持一致,这里面使用的是GIX4项目中真实的类,可能会带有一些领域特性,望读者见谅。后面可能会继续使用此例,现大致对其 阅读全文
posted @ 2010-06-25 16:32 BloodyAngel 阅读(3938) 评论(9) 推荐(2) 编辑
摘要:最近一直忙着学2010、WPF、看架构师教程、学英语,搞得都没时间写博客了。 最近在GIX4项目上做了一些性能方面的优化,为了方便和同事们分享经验,今天准备把一些相关的小技巧都写一下。这几个技巧并不难,也不是说设计得多好,而是我觉得它们很重要。记得我在做上一个Web系统时,也支持OO的业务富模型,其中大部分不太要求性能的场景中,我使用了LINQTOSQL来实现数据访问。而性能要求比较高的场景中,又使用了人工SQL来进行数据访问。但是在两种方式中,在对数据访问进行优化时,都使用了同样的方法。今天,在GIX4中又再次使用同样的方法。 可见,在面向领域模型进行编程的应用程序中,这样的优化方案可能会. 阅读全文
posted @ 2010-06-23 20:02 BloodyAngel 阅读(776) 评论(3) 推荐(0) 编辑
摘要:用户在使用GIX4某模块的过程中,内存只见加不见减。我们怀疑出现了内存泄漏,所以我花了相当一段时间来进行此问题的排查。 我使用Red Gate公司的产品ANTS Memory Profiler 5进行应用程序的内存进行监视。并在过程中修改程序中出现的一些问题。但是最后留下一个不知道原因的引用,如图1: 图1 泄漏对象引用图 由图中可以看出,Application.Resources永久地引用了... 阅读全文
posted @ 2010-03-25 14:16 BloodyAngel 阅读(2515) 评论(9) 推荐(3) 编辑
摘要:上次随便画了一篇关于GIX4项目目前的类的结构图(见:GIX4 目前大致的类结构),目的是为了更好的认识系统,并对其进行改进。发现AutoUI部分的耦合性比较大。所以提取了一个IUIFactory的接口,并用同事推荐的EA重新画了一下目前系统的图,如下: 图1 框架包图 图2 实体元数据 结构图 图3 逻辑视图(ObjectViews) 结构图 图4 命令结构图 图5 列表编辑器(ListEditors) 图6 属性编辑器(PropertyEditors) 图7 列适配器(Columns) 图8.1 视图控制器(1) 图8.2 视图控制器(... 阅读全文
posted @ 2010-03-22 12:31 BloodyAngel 阅读(2376) 评论(4) 推荐(3) 编辑
摘要:项目做了半年了,一直没把结构图画下来。为了方便以后更改和添加新功能,现在先把里面比较重要的类的结构一起画下来。暂时先用着: 阅读全文
posted @ 2010-03-18 13:38 BloodyAngel 阅读(1072) 评论(1) 推荐(1) 编辑
摘要:现象/案例 自从换了手机以后,一直使用手机进行学习,包括博客、文章、电子书。这样做是为了利用起“边角时间”。但是慢慢地,这种方式就走向了极端,而成为了我学习知识的主要方式。 反思内容 我使用这样的学习方式已经学习了好几个月了,看了很多书,但是并没有感觉到有多大的收获。和原来的学习方式相比,获得的效果差得比较远。 和穆江星的聊天中,他向我解释了“厕书”的概念。结合自己的实践,我认识到,不是所有... 阅读全文
posted @ 2010-03-15 12:26 BloodyAngel 阅读(536) 评论(2) 推荐(0) 编辑