摘要: 动机 :Plugin是在软件系统内增加功能的功能。 如果在软件系统加入Plugin功能,能提高软件系统的重用性。加入Plugin功能的软件系统在开发完成之后。 如果需要额外加入功能,不用变更已完成的软件系统就能加入新功能。 并且因为不用变更已完成的软件系统,也就避免了修改软件系统会产生的风险。另外在系统里加入Plugin功能,其实会遇到一个问题。 当有多个Plugin内容加入系统的时候,该如何去识别与取得加入的Plugin内容。本文介绍一个『Service Plugin 模式』, 定义对象之间的职责跟互动,用来实现Plugin提供的功能,并且封装Plugin内容识别与取得的职责。 为自己做个纪阅读全文
posted @ 2012-02-17 13:09 Clark159 阅读(675) 评论(0) 编辑
摘要: 动机 :在开发与数据库沟通的系统时,因为建立数据库联机是比较昂贵的。 所以ADO.NET在背后帮开发人员,实做了 ConnectionPool的机制。 将系统内建立的数据库联机做快取,当系统要使用时就直接使用快取联机,避免了每次都建立新数据库联机的花费。 并且实际上在使用ADO.NET时,开发人员对于背后的ConnectionPool机制其实是无感的。 要让开发人员无感,可是又能完成快取的功能,这真的要花一点工夫去设计。本文介绍一个『Singleton Pool模式』。 定义对象之间的职责跟互动,用来建置类似ConnectionPool功能的对象池功能,并且提供开发人员无感的使用界面。 为自己阅读全文
posted @ 2012-02-10 08:04 Clark159 阅读(848) 评论(2) 编辑
摘要: 动机 :Plugin是在软件系统内增加功能的功能。 如果在软件系统加入Plugin功能,能提高软件系统的重用性。加入Plugin功能的软件系统在开发完成之后。 如果需要额外加入功能,不用变更已完成的软件系统就能加入新功能。 并且因为不用变更已完成的软件系统,也就避免了修改软件系统会产生的风险。在MVVM的架构下View跟ViewModel各自独立,做Plugin功能也就变得比较复杂。 必须要View跟ViewModel各自都有Plugin功能然后再互相组合,才能完成MVVM Plugin的功能。本篇文章记录在WPF上,如何实做MVVM Plugin。 为自己做个纪录,也希望能帮助到有需要的开发阅读全文
posted @ 2012-02-05 15:32 Clark159 阅读(852) 评论(0) 编辑
摘要: 接续...[Architecture Pattern] Device Projection 模式 (上)实做 :范列下载 :DeviceProjectionSample点此下载范列逻辑 :下面图片是范例程序执行的结果。主要的参与者有:LightDevice.exe -仿真远程设备的程序,采用TCP联机连接LightMaster。 -窗体上灯号数据的图像,可透过右侧灯号按钮做开关。 -窗体上灯号数据的图像,接受LightMaster传送来的指令做开关。 -每300ms会将灯号数据传送到LightMaster。LightMaster.exe -映像远程设备的程序,采用TCP联机聆听LightDev阅读全文
posted @ 2012-02-02 13:33 Clark159 阅读(654) 评论(0) 编辑
摘要: 动机 : 开发实时系统的时候,常常需要建立一组对象,用来映像远程设备。 透过这组对象呈现远程设备的状态、通知。 使用这组对象封装远程设备的操作、管理。但在映像远程设备提供上述功能之前。 还需要提供探索远程设备的功能,建立远程设备列表。 这样才能完整的提供服务。本文介绍一个『Device Projection 模式』, 定义对象之间的职责跟互动,用来封装映射远程设备所需要提供的功能。 让开发人员在需要实做相关功能时,能有一个参考的架构。结构 : 下图是这个模式的示意图,整个看起来有点复杂。 我们将图拆解开来说明,会比较方便了解。 Device相关对象 : 首先是Device相关对象,这组对象主要阅读全文
posted @ 2012-01-28 23:46 Clark159 阅读(925) 评论(2) 编辑
摘要: 前言 :Log4net是一个很方便用来做Log的第三方软件。 但在输出讯息的部分,却很吊诡的「部分支持」输出 Tab符号(Tab Character)。 所谓的「部分支持」是说, 在讯息内容的部分有支持,但是讯息Layout的部分不支持。 这让开发人员做讯息排版的时候,受到很大的限制。本篇文章记录, 如何在使用Log4net输出Log讯息的时候,能够让支持 Tab符号(Tab Character)。 希望能帮助有需要的开发人员。实做 :实做的方式,主要是使用 Log4net自定义参数的功能, 加入自定义的 Tab符号(Tab Character),来达成支持讯息输出 Tab符号(Tab Cha阅读全文
posted @ 2012-01-15 14:44 Clark159 阅读(851) 评论(0) 编辑
摘要: 前言 :看到91跟小朱都分享了,延迟执行的文章。 - 91 : [.NET]延迟执行(Deferred Execution) 简单概念实作 - 小朱 :[.NET] LINQ 的延迟执行 (Deferred Execution) 唤醒了许久之前的记忆,记得也有对LINQ的运作下了一番功夫。 趁记忆还没有消失。简单的做个记录,也希望对有需要的开发人员有帮助。说明 :简单的说,在 Linq的延迟执行运作,主要有三个要点。 1. IEnumerable跟 foreach是 LINQ运作的核心。 2. IEnumerable套用 Decorator模式,对IEnumerable加入功能。 3. 使用.阅读全文
posted @ 2012-01-12 18:26 Clark159 阅读(53) 评论(0) 编辑
摘要: 前言 : 最近在处理应用程序安装的相关问题。 系统内有使用Window Time Service来完成时间同步的功能。但在启动这个服务的时候。 却发现使用ManagementObject Class控制 WMI的这种方式, 无法将Windows Service启动类型设定为「自动(延迟开始)」。使用Google搜寻之后, 找到了可以使用 Windows SC命令,来做Windows Service的管理。 并且这个方式,可以将Windows Service启动类型设定为「自动(延迟开始)」。本篇文章简单纪录, .NET应用程序如何使用Windows SC命令,来做Windows Service阅读全文
posted @ 2012-01-04 13:59 Clark159 阅读(180) 评论(0) 编辑
摘要: 前言 : 最近为了多执行绪程序分享数据集合,搞的焦头烂额。 主要的问题点卡在, 当有一条执行绪使用 foreach列举数据集合的时候,另外一条执行绪去变更数据集合。 这时候会发生Exception,通知说在列举的同时数据集合被变更。当下最先想到的解决方案是,使用lock在读写数据集合的时候做锁定。 这样的确可以解决问题, 但是因为不论读写都先lock,这样会降低程序执行的效能。 并且这样的写法,要求使用数据集合的程序代码必须要记得做lock动作,不然会发生错误。上网搜寻到这篇「再谈程序多任务(III)─执行绪安全与数据集合」,刚好解决了我遇到的问题点。:D整篇文章主要的思路就是, ...阅读全文
posted @ 2011-12-11 18:31 Clark159 阅读(125) 评论(0) 编辑
摘要: 前言 : 开发应用程序的时候,针对用户接口开发。业界有许多前辈提出了多种的设计模式,其中最为人所知的就是 MVC模式。MVC模式在实作上有许多种的方法,不同的开发人员去理解它,都会有不同的理解。不同的情景需求去套用它,也会有不同的实作。但不论怎么理解跟实作,它最基本的观念依然都是:「将系统职责拆解至 Model、View、XXX三种类别,并且定义它们之间的相依关系及沟通方式。」在微软.NET技术架构下,目前最为众人讨论的MVC延伸模式,应该是适用 WPF、Silverlight、Windows phone平台的 MVVM模式 (Model-View-ViewModel)。可以说近年微软.NET阅读全文
posted @ 2011-10-10 10:13 Clark159 阅读(986) 评论(5) 编辑
摘要: 动机 : 在设计面向对象应用程序架构的时候,对象会包含相关的企业逻辑,而不是单纯的数据对象。但是当企业逻辑需要取得其他对象一起运算,如何「取得」是一件很复杂的事情。例如说:在系统内有一个「查询客户订单总金额」的企业逻辑,需要从系统取出客户的所有订单做金额加总。这个企业逻辑实作上可以分配到不同的对象,这边我们先定义这个企业逻辑是客户对象的职责。并用下列的程序代码,实作这个企业逻辑,这样的范例是可以正常的工作。但是换个场景会发现,在只是要编辑客户电话的时候,也需要取得订单查询接口。当系统越来越庞大,企业逻辑越来越多时,这个范例架构就会显得是个灾难。而且再细看的话会发现订单有参考到客户,这个范例有循阅读全文
posted @ 2011-10-10 10:11 Clark159 阅读(35) 评论(0) 编辑
摘要: 前言 : 一般使用 BindingSource做 Data Binding的工作,不管是用 ADO.NET对象或是自定义数据对象当作数据源。运作流程大多类似1.读取数据并将数据填写进 DataSet(or BindingList)2.将DataSet(or BindingList)系结至BindingSource3.画面Control触发事件时,操作数据库(or 集合)变更数据,并且操作BindingSource显示数据。这样的运作流程,因为靠画面Control触发的事件,来当作操作函式的进入点。把这样的软件架构,会显得各层之间的职责略显模糊。职责模糊范例程序 : 按此下载using Syst阅读全文
posted @ 2011-10-10 10:09 Clark159 阅读(96) 评论(4) 编辑
摘要: 前言 : 在文章「[.NET] : BindingSource使用模式 - Data Binding基础知识 (一)」。介绍了如何将对象的属性包装成属性对象 「PropertyDescriptor」,并用它来做存取、监看变更等工作。将数据对象的属性包装成属性对象是 Data Binding运作基础,在了解这个运作之后。这边再来讨论,Data Binding时会用到的「数据源」。在大部分的书里描述,Data Binding透过 ADO.NET里的对象与数据库做互动,用来显示及存取数据库内的数据。在这架构下,ADO.NET里的物件是一种 Data Binding的数据源。相关资料 : HOW TO阅读全文
posted @ 2011-10-10 10:08 Clark159 阅读(73) 评论(0) 编辑
摘要: 前言 : 在文章「[.NET] : BindingSource使用模式 - 连动式下拉选单 (纯IDE开发)」。介绍了如何单纯使用Visual Studio的IDE来开发连动式下拉选单。用IDE开发的模式,可以快速建立项目所需的用户接口。但是当我们需要对细节有更高的掌控时,这开发模式会越来越不敷使用。这时就需要改用程序代码开发的模式,来做 Data Binding的开发设计。本篇文章简略介绍,几个设计开发 Data Binding用到的对象。让软件开发人员在设计 Data Binding相关程序代码时,能对对象运作模式有基础的理解。INotifyPropertyChanged :INotify阅读全文
posted @ 2011-10-10 10:06 Clark159 阅读(38) 评论(0) 编辑
摘要: 前言 :连动式下拉选单想必开发人员都不陌生,用来提供使用者先选祖先元素,再选子项目的数据呈现。如下图 :本篇文章介绍,如何单纯使用Visual Studio的IDE做开发。将数据库里有父子关联的数据,在WinForm上采用连动式下拉选单来做呈现。在接下来的内容里,采用「城镇-乡镇市区」的选择来当作范例。开发出一个可以让使用者选择城镇后,再选择乡镇市区的连动式下拉选单。范例下载 :CascadingDropDownListSample.zip数据结构 :本篇是采用数据库直接当作数据源。数据库名称为CascadingDropDownListDatabase,数据库内共有两个表格[CountyTab阅读全文
posted @ 2011-10-10 10:05 Clark159 阅读(25) 评论(0) 编辑