使用同一控制器进行 Win-Form/Web-Form 通用组件





4.00/5 (7投票s)
一个使用通用组件开发 Win-Form 和 Web-Form 应用程序的框架。
title: generic win-form and web-form components (basolution) author: babak ansari jaberi email: babakansari@yahoo.com member id: 36 language: c# 2.0 platform: windows, .net 2.0 etc technology: asp.net, win froms/components, web forms/components level: intermediate, advanced description: a sample framework to create and use win-form and web-from generic components with the same controller to manipulate components behaviour on screen license: "%22%22%22%22../../info/licenses.aspx%22%22%22%22">cpol
目标
本解决方案的目标是引入一个框架,用于创建具有几乎相同外观和感觉的 Windows 和 Web 用户界面的应用程序。
简介
世界上所有的公司(包括软件公司)都在寻求最短的路径,以最少的时间、最少的资源(通常是人力专家)生产出更多高质量的产品(软件)。代码重用一直是软件行业的一大挑战,也是以更少的时间和最少的资源获得高质量软件的关键因素之一。如果一家公司能够在一个产品流中同时生产基于 Windows 和基于 Web 的应用程序,那么这将为公司带来可观的效益。因为生产这两种类型的应用程序通常需要两种或三种开发方法,每种方法都有其自身的风险和考虑因素。
大多数软件程序都需要用户界面来与人交互。有各种各样的用户界面,用于各种目的。例如:Windows 窗体用于快速灵活的访问,Web 窗体用于互联网访问等等。本文介绍了一种软件架构,可以作为 PFW(持久性框架)来开发使用相同业务层和 UIP(用户界面过程)控制器的基于 Windows 和 Web 的应用程序。
BASolution 的目标是拥有通用 UI 组件,这些组件可以被各种用户界面所共享,以便开发人员可以创建和使用这些组件,而不用担心它们在不同用户界面类型中的行为。也就是说,拥有通用的 UI 组件。开发人员通过一个单一的接口来访问通用组件。例如,一个通用的文本框在 ITextbox 接口中有一个通用的文本属性,该属性对 Web 和 Windows 的通用组件都是通用的。显然,这种方法有一些限制,但根据应用程序的业务需求,这些限制也可以得到缓解。即使您使用的是 XAML,XAML 中的组件也具有一些在含义上对各种用户界面类型通用的属性和事件。分析
BASolution 是做什么的?
在这个框架中,应用程序开发人员不需要担心他们正在开发应用程序的用户界面类型,无论是 Windows 窗体还是 Web 窗体。只有组件开发人员和架构师(核心开发人员)需要了解通用组件的细节,并且如果他们想添加更多功能或根据业务开发人员的需求调整 UI 行为,可能需要进行更改。因此,产品流可以分为两条线:
- 框架组件(framework.development)开发通用组件及其行为
- 业务应用程序(app.development)使用通用框架组件创建与技术(Windows 或 Web)无关的用户界面。
设计
BASolution 如何工作?
BASolution 是一个框架,其中所有用户界面功能都通过接口来识别。使用 BASolution 开发应用程序需要 .NET 开发和接口编程技能,尽管从概念上讲它不限于任何技术。应用程序开发被分成两个解决方案:
- app.development 根据业务需求开发基于接口的应用程序。在下面的图中识别为黄色。
- framework.development 为两种 UI 类型开发组件。在下面的图中识别为白色。
Windows 窗体 UI (app.winform) |
Web 窗体 UI (app.webform) |
单元测试 (app.test) |
数据传输对象 (app.datasets) |
框架通用 (framework.lib) (framework.bainterfaces) (framework.ui.bacontroller) (framework.ui.baresources) |
(framework.ui.bawincontrols) |
(framework.ui.bawebcontrols) |
(framework.ui.bawincontrols) |
||
UI 控制器 (app.controller) |
||||
business (app.businesscontroller) |
||||
数据访问层 (DAL) (framework.dal) |
(图 3.2.1)
参考示例代码:我们有一个窗体(GeoForm,实现了 IGeoForm 接口,如示例所示),其中包含一堆组件(GeoTblGrid 实现 IGrid,GeoTblTreeView 实现 ITreeView,EntityCombo 实现 IComboBox,所有这些都在 IGeoForm 中)。每个窗体都有一个控制器对象,该对象实现一个接口(IGeoForm),用于持有和使用在 Windows 和 Web 中都使用的通用组件。在控制器中,应用程序开发人员实现 UI 行为,并使用业务逻辑层和适用于所有用户界面的通用框架的其他服务。分层架构如下:
- 表示层:一个实现 IForm 接口的窗体/页面,该接口持有一个传递给它的控制器对象的引用。
- 控制器层:每个窗体/页面都有一个控制器对象,该对象使用从窗体接口提供的通用组件来与控制器协同工作。
从示例中:GeoCtrl 控制器对象持有一个实现 IGeoForm 接口的窗体的引用,以便与该窗体的通用组件协同工作。
开发
如分析所述,可以分为两类开发人员(应用程序开发人员和核心开发人员)。像所有其他技术一样,应用程序开发建立在 BASolution 核心之上,显然核心建立在 .NET Framework 之上,等等。每个开发人员组都可以使用一套合适的框架解决方案(参考提供的示例程序)。
-
核心开发人员
开发和维护通用组件
1.1. 可执行项目(Win-Form、Web-Form 和单元测试)
这些项目可以独立执行,并可以使用底层提供的服务和通用组件。所有 BA 组件都使用绑定机制来获取和设置组件中的数据,使用绑定关系,两组绑定的组件可以建立主详细信息或父子关系。
1.1.1. Windows 窗体 (WinForm) 启动 Windows 窗体,可以访问底层的通用控制器层。
1.1.2. Web 窗体 (WebForm) 启动 Web 窗体,可以访问底层的通用控制器层。
1.1.3. 单元测试 (Test) 启动 Windows 窗体访问,并在各种场景下使用通用控制器执行其功能。
1.2. 公共库 (Lib)basically 是一个垂直层,为所有其他层提供服务。
1.2.1. Framework.Lib:所有层通用的功能。
1.2.2. Framework.Bainterfaces:所有层通用的接口。
1.2.3. Framework.UI.BaController:通用控制器。
1.2.4. Framework.UI.BaResources:所有层使用的资源。
1.3. 通用水平层
控制器以下的层,是所有用户界面类型都通用的。业务层使用数据访问层 (DAL) 来处理底层物理数据访问。
-
应用程序(业务)开发人员
使用通用组件开发业务相关应用程序。
1.1. 开发应用程序,为应用程序提供各种用户界面访问。
1.2. 使用 UI 层中提供的通用窗体和组件。
1.3. 实现每个控制器中使用的业务功能。
如何使用 BASolution 框架?
在 Windows 和 Web 解决方案中,我们都创建一个用户界面文件夹(UI 文件夹),例如 BaseFrm 文件夹中的 GeoFrm 窗体,并且在这两者中,我们都应该通过名为 IGeoForm 的接口来识别我们想要包含在这些页面中的 BA 组件。这两个 UI 容器都应该实现以下接口,该接口包含一堆 BA 组件接口。
public interface igeoform
{
string caption{ get; set; }
itextbox geotblname{ get; }
igrid geotblgrid{ get; }
igrid entitytablegrid{ get; }
icombobox geotblkind{ get; }
iaddeditdelete addeditdel{ get; }
ibindingmanager bindingmanager{ get; }
ibindingmanager detailbindingmanager{ get; }
ibindingrelation bindingrelation{ get; }
itreeview geotbltreeview{ get; }
icombobox entitycombo{ get; }
itextbox entitytextbox{ get; }
iaddeditdelete addeditdeldetail{ get; }
}
对于 Windows 窗体,我们有
public partial class lookupform : form, igeoform { … public lookupform() { geoctrl ctrl = new geoctrl(this, relationkind.lookup); } … }
而对于 Web 窗体,我们有
public partial class lookupform : webpagebase, igeoform { … protected void page_load(object sender, system.eventargs e) { geoctrl ctrl = new geoctrl(this, relationkind.lookup); } … }
对于两者,我们创建一个实现 IGeoForm 的控制器实例,如上面代码所示(new GeoCtrl(this, RelationKind.Lookup))。控制器负责使用通用组件提供的接口。
/// geoctrl is the controller class for igeoform public class geoctrl { … public igeoform theform; public geoctrl(igeoform theform, relationkind kind) { /// set the form that uses this controller to a /// variable being used internaly by the controller this.theform = theform; … } … }
该图显示了所提供示例中使用的所有通用组件。如图中所示,所有可视化组件都绑定到一个非可视化绑定管理器组件,而绑定管理器又绑定到一个绑定关系组件,以控制它们的状态(添加、编辑、删除或只读)。
summary
为了使用 BASolution 创建同时具有 Windows 和 Web 用户界面的应用程序,我们应该为每个用户交互组件(如 Web/Win 组件(IGrid、ITextbox、ITextbox 等))和窗体/页面(IGeoForm)提供接口。用户界面组件可以包含其他通用组件(IGeoForm 包含 IGrid、ITextbox、ITextbox 等)。控制器对象可以使用每个 UI 提供的接口来实现业务功能。使用提供方法/属性和接口的通用组件有其自身的局限性,可以根据业务需求进行缓解。