建立智能客户端应用的开发路标
[原文:Developer Roadmap For Building Smart Client Applications]
[中文名:.建立智能客户端应用的开发路标]
[出处:
]
[作者:Jay Tallamraju]
[翻译:漂泊者]
实行概要
微软最近发布了许多不同的工具和技术并且还会继续发布。对于已经熟悉.NET1.1和Visual Studio.NET 2003的人来说这是偶尔发生的。也有小数开发者刚刚停止是使用应用块或企业类库还是自己开发的争论。不幸的是不是每个人都有时间去更新他们的技巧,使用新的技术,主要是由于当前的工作量和已经在.NET1.1下开发的项目。也可能有少数的开发者淹没在或困惑于大量推给他们的材料而不知道该从那里开始。这篇文章集中于清除这方面的困惑,有助于对最近引进的新的技术得到一个高层次的观察。
这篇文章集中于新工具/技术高层次的观察。因为难于同时覆盖技术的宽度和深度,我将试图避免一些细节并提供获得文档和资源的链接。并不会重复已经发表在许多书上或文章上的信息。在这篇文章中我试图通过提供可靠的学习计划指导跨过这些不同的技术/工具。在每段都会有一些有用的技巧和引用。
这篇文章所覆盖的工具和技术主要用于开发Windows智能客户端窗体。在这篇文章中并没有覆盖Web和移动开发的内容,但一些概念[企业类库,数据访问]可以应用到它们。所以当我指“每件事”时,我并不仅仅是“Windows智能客户端窗体”开发的技术。
听众
.NET1.1开发人员
以顺序的方式来覆盖这些技术有助于只有.NET1.1框架和Visual Studio.NET2003方面的技巧的读者。我也认为这种方式对高层次的听众也是有用的。如果你想跳过个别章节的话请看下面的图表。
管理者
软件管理不再会非技术的,如果你正在管理一个软件项目,更新到这些新的技术将是非常重要的。正确把握技术的方向有助于管理者地正确的时间做出正确的决定。这篇文章有助于管理者对智能客户端开发需要把握那些技术。
开发windows窗体智能客户端
技术/技巧地图
请看下面的技术/技巧地图决定读这篇文章你将采取的步骤。读整篇文章或者依据地图完全取决于你的自由。我喜欢叫他们步骤而不是标题是为了强调次序的重要性。
概述
过去微软习惯于发布操作系统和有少数SDK的IDE工具。对开发企业应用的开发者习惯于依靠少数的第三方的控件/工具。最近微软的模式与实践小组的工作对推进企业开发做出了重要的贡献。这个小组发布的类库和工具也有助于在跨项目之间设计和开发的一致性。
第一步:.NET 2.0 框架
CLR/CTS和框架
.NET框架是所有使用.NET开发的基础。我的兴趣并不是重复已经发表的内容。但我包含这一步是因为把握框架的概念和在.NET2.0中新的特性对理解别的技术是非常重要的基础。
对新手的术语
名称/缩写 |
描述 |
CLR |
通用语言运行时-.NET框架提供的运行环境 |
CTS |
通用类型体系-支持增加能够用于多种语言的类型 |
Assembly |
托管环境中的动态库 |
Application Domain |
托管环境中的进程 |
Managed/Unmanaged |
托管代码指能够被.NET框架管理的东西。非托管代码指直接使用操作系统的特性/api/其它非托管的类库。 |
GAC |
全局程序集缓冲 |
范型
范型是非常有用的,允许我们写类型不可知的代码。如果你使用过STL(标准模板库),范型遵循相同的概念。在.NET1.1的时代,为了创建类型安全的集合,对每一种类型的集合必须创建新的集合类。这将创建大量的重复的代码只有集合拥有的类型是不同的。用.NET范型我们仅仅需要创建一个把类型作为变量的类和使用类型作为变量来写代码。
看下面的代码可能会更清晰:
.NET1.1的代码:
public Employee GetValue(Employee val1, Employee val2)
{
return (val1 == null ? val2 : val1);
}
public string GetValue(string val1, string val2)
{
return (val1 == null ? val2 : val1);
}
.NET2.0的代码
public T GetValue<T>(T val1, T val2)
{
return (val1 == null ? val2 : val1);
}
使用示例:
String val = GetValue<string>("val1", "val12");
Employee emp = GetValue<Employee>(emp1, emp2)
注意:.NET2.0引进了nullable类型(T?或System.Nullable<T>)和新的操作符’??’。它简化了将nullable的值指定到non-nullable的值的代码[例子:”val3=val1??val
部分类
如果我们理解了在什么地方使用和如何使用部分类的话部分类将是非常有用的。他们允许设计器产生的代码和应用代码清晰地分离到不同的物理文件中,在扩展功能方面有更多的灵活性。例如,在.NET1.1中VS.NET2003产生的强类型的DataSet的代码并没有直接的方式重载代码,这是因为VS.NET2003重新产生强类型的DataSet代码时将重载开发者对代码的改变。VS.NET2005使用部分类这种方式允许我们实现少数别的定制的接口或者属性/方法在许多场景下是非常有用的。
别的例子:有别的场景我们需要实现多个接口但想在一个类中实现。三个开发者能够创建三个类文件每个实现不同的接口,别的开发者可能实现派生于一个基类的同样的类。当编译时,产生的类将派生于单个的基类并实现所有的接口。从一个开发者的观点看,一旦类被编译,一个部分类就如同一个常规的类一样。
VS.NET2005对设计器产生的控件/窗体代码使用部分类。这种方式分离了应用代码和设计器产生的代码,使程序更容易维护。
ClickOnce
ClickOnce支持松软的Windows窗体应用的部署,如果使用VS.NET
ClickOnce是.NET2.0中一个新的部署技术,使部署Windows窗体应用非常容易。使用引导装入支持和使用用户安装特性,它带Web部署的方便性给Windows窗体应用。你能使用ClickOnce技术来部署一个智能客户端或常规的胖客户端Windows应用。
详细看第二步,对VS.NET2005加引导程序支持和额外的依赖动态库到项目来使用ClickOnce部署。
ADO.NET2.0
在ADO.NET中有几个重要的变化可能是有用的:
Multiple Active Results Sets(MARS):你现在能够在一个同样的链接上保持多个DataReader打开。我并不清楚是不明所有的ADO.NET提供器支持这个特性。微软的Sql Server和Oracle OPD.NET提供器支持这个特性,你可能并不关心其它的提供器。
DataTable:DataTable现在有许多有用的以前只有在DataSet层次上才有的方法。所以你并不需要创建DataSet,依俯DataTable到DataSet来使用这些方法,现在能够直接调用这些方法。
DataSet:在这方面有少数的增强,一个改善就是DataSet现丰支持二进制序列化,它可能会改善性能[主要用于.NET远程应用]。
你能看到许多新的特性在下面的“开发者参考”链接上。你要当心并不是所有的特性都可利用/得到支持对所有的ADO.NET提供器。一些可能是特定于Sql Server并且只支持于Sql Server ADO.NET提供器。
如果你在写数据访问代码,推荐读文章“使用VS.NET2005建立数据访问层”。在数据访问上有许多方面并没有在这篇文章中,但我能看到人们更多是转向ORM工具或产生代码的方法或面向对象的方式(看微软的ADO.NET实体框架)。当你迷失在不同的方法论或方式中时,数据访问层对一些项目就变得非常重要了。所以选择一个最适合你的需要,并不是每一个都适合于所有大小的项目。
我推荐你使用企业类库中的数据访问应用程序块来写数据访问代码。使用ADO.NET接口类型避免特定的提供器类型是可能的。如果你需要写大量的数据访问代码你可能得花时间从上面所述中评估一个最好的选择。
Windows窗体2.0
对用户界面开发者来说一个好消息就是开发变得越来越容易了,能够创建更加专业的Windows窗体应用程序。当然,对一个软件来说,光有好的用户界面还远远不够,可用性,用户响应,性能和稳定性也是非常重要的。新的特性和Windows窗体中新支持的控件可以帮助你处理这些难点。下面是少数我认为是关键性变化是非常有用的。请看引用段得到更加详细的信息。
应用/用户范围设置:对应用范围和用户范围的设置有了更好的支持。用户范围的设置缺省被保存在用户当地设置的文件夹。
后台工作线程组件:在后台线程中耗时的工作对用户界面程序来说是常见的。后台工作线程组件对在单独的线程中作后台工作有很好的支持。后台工作线程组件是非常容易使用的,不用写过多的代码,可以直接创建线程来实现后台进程。
切分容器:增加了许多新的控件,是最喜欢SplitContainer控件。你能用它把客户区域切分成两个水平或垂直的段落。通过使用嵌套的切分容器控件可以很容易地把主容器区域切分并在它们上面停靠控件。
Web浏览器控件:Web浏览器控件有个最基本的支持显示一个URL地址的内容。如果你需要更多的浏览器的特性你需要作一些额外的编码,否则基本上不需要作什么工作就可以使用浏览器控件。你能使用这个控件来查看你的应用内部的一些文档[微软的Office,pdf文档等]。对这个用途这个控件是非常有用的。
学习曲线
你的技巧 |
复杂程序 |
估计(天数) |
新手 |
中等 |
7 |
.NET1.1 |
低 |
3 |
开发资源
第二步:Visual Studio.NET 2005
Visual Studio.NET2005 IDE/特征
难以想象不使用Visual Studio.NET来开发.NET应用程序,也难以想象有人不知道Visual Studio。如果你还没有看到Visual Studio.NET2005的话,你可以从微软的网站上下载免费的Visual Studio.NET 2005简化版或可以有90天试用期的Visual Studio.NET 2005专业版。
Visual Studio.NET,微软的集成开发环境,在2005版比以前更好用了。在2003版中少数讨厌的/不见的特性已经在2005版中得到修正。一个值得注意的特性是ASP.NET项目创建在不同的机器上现在不用创建虚拟文件夹就可以打开了。2005版支持使用基于Web服务的文件使得ASP.NET程序更容易开发。
重构代码
Visual Studio所支持的代码重构可以简化少数日常任务(例如:从存在的类中建立接口,这是一个非常酷的特性)。
代码生成
代码片断和生成接口实现代码模板是非常有用的特性。请看资源段得到有关VS 2005的新的特性。
发布/ClickOnce
在Visual Studio 2005中发布特性是非常有用的,可以使用ClickOnce部署技术来部署Windows 窗体项目。项目能够部署在FTP服务器,Web服务器,当时的文件路径或网络路径上。通过使用Visual Studio2005来使用ClickOnce部署技术你并不需要作什么工作。在项目属性页上很容易配置发布属性。下面的插图显示了在Visual Studio2005中项目属性页上的发布页。
学习曲线
你的技巧 |
复杂程序 |
估计(天数) |
新手 |
中等 |
4 |
.VS 2003 |
低 |
1 |
开发资源
第三步:企业类库2006
应用块概述
应用块最初出现在.NET1.0/1.1的开发中,过去有许多版本。微软最近发布的版本应该是最好的。
企业类库是什么
每个项目中都有许多通常的任务:日志,异常处理,数据访问,缓冲,认证/授权和加密。当然不是每个应用都使用所有的特性,但所列的大多数特性对企业开发来说都是有用的。为什么在每个项目的日常开发中都要提出定制的解决方案来处理如此通常和标准的困难呢?通过对每个开发种类创建应用块企业类库解决了这个问题。应用块应该是可配置的类库支持应用基础构架如日志,缓冲,数据访问等。
下面是企业类库2006发布的六个应用块:
1、 日志应用块
2、 异常应用块
3、 数据库访问应用块
4、 缓冲应用块
5、 加密应用块
6、 安全应用块
下面的图来自于微软企业类库2006文档,它对类库中的应用块和继承关系作了一个很好的描述。
企业类库安装对每个应用块都有卓越的文档和动手实验室。在下面的段落中我有意只是显示了使用每个应用块所要求的代码。对企业类库的新手来说这会增加他们的舒适感。请看“开发资源”得到关于企业类库2006快速开发更多的细节。
日志应用块
允许开发者记录使应用特定类别的信息而不用关心这些信息是如何存储的。在应用配置文件中的日志配置信息很容易配置每个日志消息应该记录到指定的日志监听器,日志监听器是基于类别的。
例子代码:
LogEntry logEntry = new LogEntry();
logEntry.EventId = 55;
logEntry.Priority = 1;
logEntry.Message = "Started calaculation Process";
logEntry.Categories.Add("DEBUG");
Logger.Write(logEntry);
或
Logger.Write("Starting Calculation", "DEBUG");
日志块能够配置,报告严重的错误到事件日志中,所有的调试语句到当地的文件和其它的细节到数据库。有着非常好的灵活性如果你不满足于现有的你能增加你自己的监听器和扩展日志块。
异常应用块
异常应用块改善了应用中异常处理的过程和策略。异常块使用配置驱动的方法在记录异常,什么时候重新抛出原始的异常或个性异常等方面有着更大的灵活性。
例子代码:
try
{
// Run code.
}
catch (Exception ex)
{
bool rethrow = ExceptionPolicy.HandleException(ex, "ServerPolicy");
if (rethrow)
throw;
}
数据访问应用块
数据访问应用块允许写在ADO.NET方面对数据库/提供器一致的代码。它更容易使用,可以在配置中改变实际的提供器。例如,如果数据访问代码起初针对特定的数据库使用OLEDB ADO.NET提供器写的,不用个性代码,应用就能切换到本地的ADO.NET提供器所支持的数据库。开发者应该注意不能使用特定的提供器类型应该使用ADO.NET接口类型来编写数据库/提供器一致的代码。
例子代码:
Database db = DatabaseFactory.CreateDatabase();
int cnt = db.ExecuteNonQuery(CommandType.Text, "select count(*) from authors");
联接字符串和提供器的信息可以从数据访问应用块配置节中得到。
安全应用块
在许多应用中,通常要求实现认证(身份确认-人是谁)和授权功能(检验你能作什么-角色)。虽然从需求层次来说是一样的,但每个应用可能选择使用不同的认证存储和方法来实现这个功能。安全应用块帮助你写一致的代码处理实际的认证/授权存储。
例子:
Bool isLogin = Membership.ValidateUser("user", "pwd");
上面的行是认证用户,使用配置中缺省的成员资格提供器。
缓冲应用块
对应用来说缓冲只读的和在内存中很少更新的数据是非常平常的任务。特别是在服务器端的程序中。有许多方法可以维护缓冲(例如:哈希表,静态成员等)。每个应用在何时和如何刷新或失效缓冲数据时可能采用不同的方法。缓冲应用块在缓冲上使用这些策略,使缓冲更容易。实际的缓冲存储可能还是键/值对但支持缓冲策略。我发现在服务器端编程中这个块是更有用但你也能发现在客户端应用中它也是有用的。
例子代码:
CacheManager cache = CacheFactory.GetCacheManager();
if(cache.Contains("EmployeeList"))
{
EmployeeList lst = GetEmployeeList();
cache.Add("EmployeeList", lst);
}
加密应用块
支持单向加密和双向加密。你不能解密一个单向加密的字符串。它对加密口令、信用卡信息等是非常有用的。使用双向加密你能加密和解密数据。对配置文件存储联接字符串或其它敏感信息是非常有用的,因为应用程序在运行时需要解密的形式。
例子代码:
// 加密和解密
string b64data = Cryptographer.EncryptSymmetric("provider", "data");
string data = Cryptographer.DecryptSymmetric ("provider", b64data);
// 得到哈希值
string pwdHash = Cryptographer.CreateHash("provider", "password");
推荐对哈希使用SHA256(可靠的哈希算法),对称加密使用AES(先进的加密标准)。在配置文件中你能配置指定的加密提供器的选项。
对象建立器/注入模式设计
我们不会直接使用ObjectBuilder但是需要知道这些概念。随后当你读CAB时,理解Objectbuilder对你会有帮助。
企业类库配置管理
每个应用块要求在应用配置文件中琐的配置段和配置数据。很难以记住所有这些细节和手工来修改应用配置。为了处理这个问题,企业类库提供了配置管理工具来管理所有应用块的配置。你能使用这个工具来修改存在的应用配置文件或创建新的应用配置文件。企业类加配置管理工具不论对开发者还是管理者都是非常有用的工具。
如同你在下面看到的企业配置管理工具非常容易管理类库中的应用块的配置。
注意:企业类库应用块设计是非常灵活的和可扩展的。使用起来非常简单,否则开发者不会使用企业类库。但是一旦你深入进去,你将微软所作的大量工作。企业类库也提供了非常好的文档,快速开始和动手实验室。更重要的它是免费的。
学习曲线
你的技巧 |
复杂程序 |
估计(天数) |
新手 |
中等 |
5 |
使用过应用块 |
低 |
2 |
开发资源
我的经验,除了“企业类库
安装“企业类库2006”
对每个应用块按照下面的顺序阅读文档/帮助和快速开始
日志应用块
异常应用块
数据访问应用块
缓冲应用块
加密应用块
安全应用块
安装“企业类库动手试验室”
动手试验室是快速学习新技术最好的方式
动手试验室指示你每一步应该作什么和为什么要这样作
按照上面的次序来试验
第四步:CAB-组合UI应用块
对使用过UIP的开发者来说,CAB块看起来很熟悉。但是在这个新的版本中微软模式和实践小组作了大量的工作来消除UIP块的缺点,使之更符合真实的开发环境。
重要:对用户界面开发者,学习这个应用块可能是有用的。更多的在服务器端编程的开发者可以跳过直接从第七步开始。另一个重要的注意就是用户界面开发者不要低估这个应用块。理解和掌握这个应用块并不象使用企业类库中的应用块那么容易。当使用这个应用块是要求主要的概念要发生转变,要习惯于基于宣称/属性的编程,更多是思考而不是调用API,更多是按照步骤来作。需要花时间来学习这个应用块,微软的模式和实践小组作了大量的工作提供了非常好的文档和动手实验室便于学习这个应用块。
对开发者更好的消息是使用“智能客户端软件工厂”使得使用CAB块更容易。但这并不会降低学习曲线。在试着写智能客户端工厂代码前理解CAB块的核心概念是非常重要的。并不是所有的开发者需要知道CAB的每个方面。基础构架组需要了解CAB的所有方面,而模块开发者只需要关心如何建立模块。你能在CAB的文档中发现这些细节和足够的指导。
学习曲线
你的技巧 |
复杂程序 |
估计(天数) |
新手 |
高 |
5 |
使用过应用块 |
高 |
5 |
开发资源
安装“CAB-组合UI应用块”
按照下列次序读文档和快速开始
智能部件
事件转发器
模块装载器
端对端的预排
安装“CAB-动手试验室”
按照次序进行试验
至少需要1到五次
按照上面的次序进行试验
注意:当你使用第三方的UI控件时,大部分时间花在框架特性象停靠或导航,扩展CAB创建特定的Workspaces或UIAdapters。CAB自带的Workspaces或UIAdapters是基于Windows窗体控件的,在特定的模块视图中你仍然可以使用它们。CAB带的文档和例子会提供足够的指导来指导你如何扩展CAB。
第五步:指导自动化
对开发Windows窗体智能客户端应用,开发者并不需要知道过多的指导自动化,只需要了解如何在Visuao Studio中通过智能客户端工厂来使用它们就行了。指导自动化是对Visual Studio2005的一个扩展。请看“开发资源”段得到指导自动化和扩展工具包的安装信息。
在一个开发团队中,构架师和团队领导会对开发者提出设计/开发的标准和编码指导方针。这有助于编码的一致性。但不幸的是,并不是所有的开发者都有同样的技巧和经验。很难以文档化每一个开发细节,也不能期望所有开发者阅读文档和遵循校准。这就是指导自动化产生的原因。
使用指导包,构架师能够创建一个具有完整功能的项目/解决方案模板和代码块,遵循项目标准有助于开发者在随后的开发工作。通过在Vusual Studio2005中的指导包,开发者很容易从指导包中创建项目和代码。指导包是非常强大的,有助于在组织中大量的共享的可重用的代码块和别的标准模板的一致性。当你使用智能客户端工厂时,你将看到指导包的威力。
开发资源
安装“指导自动化和扩展工具包”
阅读帮助/文档(包含在安装中)
如果你有兴趣创建你的组织中的指导包的话,你会从Internet上发现许多有用的资源。如果你只有兴趣使用智能客户端工厂指导包的话(看第六步),就不需要知道如何创建一个包。
第六步:智能客户端软件工厂
迄今为止,我们介绍了企业类库应用块和CAB块、.NET2.0框架和Visual Studio2005。如果不能理解所有的概念和把它们作为指导方针来使用的话,我们并不能通过使用这些新的工具/技术来得到任何好处。即使提供完整的文档和代码,也很容易犯错。在今天开发日益紧迫的环境下,也需要化时间来理解新的技术和按照正确的方式来使用它们。因为这个原因,微软的模式和实践小组创建了软件工厂。因为代码是通过包产生的,所在有一致性的代码,也不容易犯错。
微软的模式和实践小组在Visual Studio2005中使用指导自动化来创建智能客户端工厂。因而,智能客户端软件工厂作为一个工厂,它将创建关键的软件组件和自动化许多开发过程中重复的任务。智能客户端软件工厂并不是一个类库或API,只是一个指导包来简化使用组合UI应用块。所以如果你计划使用组合UI应用块来建立你的Windows窗体应用的话,就可以使用智能客户端软件工厂避免大量的麻烦。
对开发者来说,智能客户端软件工厂也提高了生产力和理解如何使用CAB块。下面的例子能给你一个快速的浏览智能客户端工厂能够做什么:
使用“智能客户端软件工厂”指导包创建一个新的智能客户端应用时,创建下面的图中所显示的包含项目列表的解决方案。
MVC对比MVP
使用CAB块和试验“CAB动手试验室”的开发者熟悉MVC(模型-视图-控制)模式。出于简化和易于使用的原因,智能客户端工厂例子和参考的例子,使用MVP(模型-视图-推荐)模式。下面来自于是智能客户端软件工厂文档的插图显示了MVC和MVP模式的区别:
学习曲线
你的技巧 |
复杂程序 |
估计(天数) |
新手 |
中 |
4 |
使用指导包 |
低 |
2 |
开发资源
阅读文档/帮助
试验参考的例子
试着使用智能客户端软件工厂来产 生新的智能客户端项目
第七步:有用的工具和将来.NET版本
有几个第三方的工具可能会对开发者在测试等方面有 所帮助。NUnit是一个很好的测试框架,Visual Studio2005也支持写单元测试。下面是几个开发者可能会有兴趣的有用的链接。
下面的表列出了业界新的术语和解常用语。它有助熟悉这个术语。大多数可以通过字面意思得到理解。
术语/常用语 |
描述/注释 |
SOA |
面向构架的服务 |
.NET3.0 |
.NET框架的下一个版本。最近微软宣布WCF[Windows通讯框架],WFS[Windows工作流基础服务],WPF[Windows表现层框架]和别的核心子系统作为.NET3.0框架的一部分。 |
WCF/Indigo |
Windows通讯框架[Indigo]-你能从下一代Web服务中看到。 |
SPF/Avalon |
Windows表现层框架[Avalon]-它确实是非常酷的,目前还没有替代Windows窗体系统。CAB块被设计成能够处理Windows窗体和WPF应用[按照CAB文档] |
|
异步Javascript和XML。当建立Web站点时有 用的,对Windows窗体应用来说并没有用处。有许多开发支持AjAX的Web控件的供应商。在Windows窗体应用中使用智能客户端能够象Web应用那样部署。使用AJAX是另外一种方式,它可以在Web应用中得到象Windows窗体应用那样更为丰富的用户体验。 |
WFS |
Windows工作流基础服务-对工作流应用来说,目前是很有前途的和用处的。我所听说的,可以单独使用工作流基础服务的规则引擎和调度。 |
Vista/Longhorn |
微软的新的操作系统 |
结论
在一篇文章中并不容易覆盖不同的技术细节。我有意并不深入到任何特定主题的细节。这篇文章的主要目的是帮助对.NET还不熟悉的人(包括开发者)能够对最近的技术/工具得到一个快速的浏览。目的是激发读者学习新工具/技术的积极性。在每一个技术领域这篇文章在“开发资源”段都提供了有价值的信息,它有助于是得到一些技术的进一步的理解。
我经常收到一些邮件询问如何提高他们的技巧。不知道他们现在的技术水平和准备掌握什么它是很难回答这些问题的。我希望这篇文章通过提供对开发者的路线图来处理这个问题。
不承诺:这篇文章中的观点是基于我的工作经验,仅代表我个人的观点。并不代表微软或其它的公司。文章中提供的URLs/资源链接可能导航到不同的Web站点。提供的链接只是帮助读者快速熟悉新的技术。我只是尽力量提供正确的细节,如果你发现有错误请将错误发送给我。