一个四层应用体系架构 [CBOFramework C# Beta 1 ]

基于C#的五层架构研发 本人认为微软在很多应用层面是后来居上的,以维护在开发圈的竞争地位。所以很多模型架构都跟Java后其他语言又沾边的,一边对比一边学,我觉得而已。 就好像微软IDE(VS系列)中的IIS服务,我们可以用Apache与其比较;又或者可以用VS中WCF服务与Web Service或RMI对比等。 阅读详情

一个四层应用体系架构 [CBOFramework C# Beta 1 ]

 


小气的神

2002-5-12

 

Article Type: Overview 

难度等级:7/9       

版本:3.22

 

       有关dotNET下的应用体系构架的话题,我们可以明确的从某一点开始,但是可能没有结束的那一点,永远没有:) 一大批原来COM+的程序员开始在COM和dotNET之间走钢丝,一方面忙于将重点和应用向dotNET构架上转移,一方面还要照顾着原来的COM。最后这些程序员将在经历了某一个学习曲线之后坦然的面对两者,掌握了如何分别和两者交互和周旋的技巧。但是问题可能才刚刚开始,因为他们很快开始问这样的问题:今后的程序该怎么写,程序的构架是怎样的?

 

       太多的程序构架模型,让他们开始有些眼花缭乱了,新的概念和技术似乎太多了,掌握了这些概念之后会发现一种无从下手的感觉,你不知那一种方式是相对最好的。Paul D. Sheriff (PDSA, Inc.)在4月底的MSDN上发表了Designing a .NET Application( Updrading to Microsoft.NET )的文章,里面有总结了目前dotNET下常用的几种程序构架和各自的特点。事实上,当你使用ADO.NET, ASP.NET, COM+, Web Services , XML, Remoting, DCOM/SOAP/HTTP就可以象他那样组合出不下20种的三层或多层构架形式。另外还可以加上MSMQ 和SQLXML。

 

       一部分程序员已经开始有些怨言,相对于J2EE的严格规范,dotNET下的架构似乎过分开放了。相信这种状态还会持续一段时间,Microsoft也需要经历一个优化和整合的过程才能做出富有成效和建设性的指导和建议。这之前的时间里,对于应用架构的选择问题可能会落到ISV和开发人员身上。

       经过一段时间的发展过程中,有一些原则已经被总结出来,并且被越来越多的应用起来,比如:

1.      使用统一和强健的DAL(Data Access Layout)和存储过程,使得数据服务层更加接口化和高效能。

2.      应用面向对象分析和设计将Business层组件和对象化,从而顺利使用设计模式,提高可重用性。

3.      设计时充分考虑面向Web Services的接口和功能。

4.      使用dotNET接口和属性将三层更加细化和分层以提供更高层次的抽象。

5.      层与层之间的接口越来越“松散耦合”,稳定性和灵活性明显获得提高。

6.      使用COM+的比重开始降低,COM+被精确的应用分布式、多数据库和核心中间件上。

7.      商务逻辑更加细化,一定比重的商业逻辑的实现从商业逻辑层移到表现层,由多层共同完成。

8.      Web Server开始慢慢成为离客户端最近的业务逻辑代理和资源、权限的控制器。

9.      WebForm和WinForm提供了丰富的UI,使得表现层有更多精力处理用户会话、登录、权限等问题。

10.  XML和Schema被更多的应用在设计中,往往成为系统中多层之间联系和通讯的“胶水”和介质。

 

下面要说的这个四层应用体系架构源于《Designing Solutions With COM+ Technologies》中的11章的一个实例。Wade Baron将原来的三层结构进行了调整,其一是实现客户端的对象化访问,其二是将业务逻辑层分为事务服务层和对象服务层,对象服务位于表现层(客户端),事务服务在原来的业务逻辑层,位于服务器端。具体的见下图:

 

 

CBOFramework框架体现了上面的2,4,7,10的一些特征,特别是引入了面向对象的设计和分析,结束了返回ADO记录集的Business对象的混乱表现,使得表现层有更多的精力处理自己的逻辑。另外一方面由于实现了抽象和对象化,使得设计时可以应用目前已知的多种设计模式。

 

CBOFramework中也使用了Collection的技术和概念,但它不同于早先Mike McClure (Microsoft)和Leo Romano(Sierra System Group Inc)描述的ECC(Engine-Collection-Class) Framework。CBO也可以应用Object Factory或其他的设计模式,但作为核心设计上CBO没有强调设计模式,而是体现了接口编程和面向对象分析技术。在表现上CBO没有ECC那么直观和有针对性,我个人认为CBO更加强大和先进,负载上比ECC的Collection传递要小许多,并且由于是接口设计更容易扩展,比如可以使用dotNET新的Remoting、SOAP协议作为分布协议,当然两者并不冲突,理解ECC对于理解CBO有很大帮助,因为两者有些是相同的。

 

由于篇幅有限,我将不翻译原文的设计思路和描述,强烈建议你从原著和书中获得更详细的设计思想和内部流程。本文将提供原来没有的类图表示(这是从Visual Studio.NET中反向工程我的代码获得的)我将整个框架按dotNET的方式以C#重新编写(原来作者提供一个Visual Basic版本的Project),表现层,我没有使用作者的,而是重新写了一个简单的进行测试,(我更希望未来直接使用作者的例子,因为他的客户端实现更好和更完整)。另外,Shippers对象(三个类)我没有完成,因为理解框架后一些对象的实现基本上是Copy/Paste的过程。例子使用的数据库是SQL Server和MS Access数据库中著名的Northwind的样本数据库,未进行删改。

 

 

系统需要的环境:Visual Studio.NET EN RTM+, SQL Server 2000 SP2.

 

细节和实现:

整个框架定义了四个接口、一个对象持久性的实现和一个Object Collection的实现。

接口:IPersistObjectStream和IObjectStream是客户端接口

 

 

 

接口:IPersistTransStream 和 ITransStream 是服务器端接口。

 

 

 

CBOCollection是一个Object Collection实现,被用于实现对象集合。

所有对于每个对象的集合比如:Customers、Orders等等都必须一个集合对象,由于dotNET不提供generic porgramming特性(templates),那么为每一个现实对象实现一个Type-safe的集合对象将是痛苦的。这里我使用了Chris Sells提供的CollectionGen工具,产生了一个Object类型的通用CBO Object Collection。(生产速度很快,而且很方便但不是Type-Safe的Collection,这意味着可能会有一定类型转换的性能消耗,太多集合对象,一个一个产生似乎太….)

 

 

CStream 实现IObjectStream和ITransStream ,这个类实现了将客户端的对象保持到数据库中(对象持久性)。目前这个类借助XML,使得客户端将通过透露的接口把对象序列化到这个XML流中,并且可以进行读取;同时服务器端事务对象可以从这个对象透露的接口中读取数据。

 

 

事务服务层(Transaction Services)的对象

所有的事务层对象都必须实现IPersistTransStream,这个接口被流对象调用,用来将数据写到数据库中。下面是一个Customers事务对象的实现

 

对象服务层( Object Services)的对象

对象服务层的对象:对象和对象集合都必须实现IPersisObjectStream接口。这个接口主要由流对象使用,用来从XML流中加载对象和将对象状态保存到XML数据流中。

 

 

客户端:

       使用CBOFramework的好处可以在客户端得到最好的体现,现在表现层用户可以将自己的精力完全放在表现层的界面和业务逻辑流程的处理上,而不用理会记录集字段的次序和类型转换。表现层的用户可以更加容易的使用这些和现实中类似的对象来进行编程和操作,达到和业务流程的对应。

 

 

典型的DNA架构

CBOFramework

获得对象

Dim RetRst as AD.ORecordset

Dim Customer as Object

Set Customer = CreateObject(“Custom”)

set RetRst =

Customer. GetByCustomerID( txtSearch.Text )

CCustomers m_oCustomers = null ;

CCustomer m_oCustomer = null

m_oCustomers = new CCustomers() ;

m_oCustomer =

m_oCustomers.GetByCustomerID( txtSearch.Text )

绑定

txtCompany.Text = RetRst(“Company”)

txtContact.Text    = RetRst(“Contact”)

txtTitle.Text   = RetRst(“Title”)

txtAddress.Text = RetRst(“Address”)

txtCity.Text    = RetRst(“City”)

txtCompany.Text=m_oCustomer.Company; 

txtContact.Text= m_oCustomer.Contact ;

txtTitle.Text   = m_oCustomer.Title ;

txtAddress.Text = m_oCustomer.Address ;

txtCity.Text    = m_oCustomer.City ;

修改

lret = Customer.UpdateAddress( Addre)

m_oCustomer.Address = Addre ;

m_oCustomer.Save() ;

删除

lret = Customer.DeleteCustomer ( CuID)

m_oCustomer.Delete() ;

新增

lret = Customer.AddNew ( A1,A2,A3…)

m_oCustomer = new CCustomer() ;

m_oCustomer.Campany = A1 ;

m_oCustomer.Contact = A2 ;

………

m_oCustomer..Save() ;

当然这里简化了一些,典型DNA架构下的一些记录集的检索、计算、求和等等被简化了,事实上这些逻辑经常乱七八糟的排在表现层的代码中。CBOFramework最终达到我们的目的:提高可重用性,代码更加简洁和易于维护。

 

未来:

       这是CBOFramework的第一个版本,其目标是理解其架构并将其在dotNET平台上实现。必须承认这个版本是非常原始和简陋的,仍有许多没有完成。它仅仅阐明了整个框架,展示了对这个框架的一个实现和应用,我想未来会对CBOFramework做更多的补充和调整,比如下一个版本会增加下面一些特性:

1.      目前还不能算是真正的分布式,所有的事务服务层对象还没有从ServicedComponent继承(我注释了这可能不是最终方案),那么对象服务层和事务服务层的通讯(非本机)还必须通过DCOM,也就是需要在COM+进行打包部署。下一个版本会实现在对象服务层和事务服务层实现Remoting协议通讯,当然最好同时兼容DCOM。

2.      实现一个通用的DAL或DAO (Data Access Object),统一事务服务层对于数据库的访问方式,使之兼容MSSQL,XML、OLEDB和SQLXML。

3.      完善应用的实例,并且通过使用一个创建类型的设计模式,使原来的作者的VB实例(COM用户)可以透明的使用新的组件。另外增加ASP.NET的实例。

4.      将框架中使用的XML函数进行整理,统一成一个XMLHelp类便于重用。

5.      基于上述CBOCollection的描述,将这个类的实现从CBOFramework的命名空间中移出来,放到次一级的命名空间,便于以后使用的框架的用户决定实现自己的Object Collection类。

 

总结:

       以上我们基本讨论一个和原来Windows DNA相关的体系结构的改进版本:一个四层的结构。这种结构调整了原来常见的三层结构的分类并引进了面向对象的设计和分析。另外CBOFramework使用接口和流的概念借助XML实现了一个对象持久化(对象到关系数据库的映射)。整个CBOFramework充分使用了接口定义,所以非常利于扩充和改进。个人认为理解这个框架本身比使用这个框架意义更加重大;虽然它还十分单薄,但我想这将一个不错的开始。

 

      

源代码:

       [CBOFrameworkLib 134K]         

 


特别:

本文原创优快云署名首发,所有文字和图片版权所。未经授权请勿传播、转载或改编

如果有问题或建议,请发电子邮件给new2001@msn.com

CBOFrameworkLib 中源代码属于演示用途,没有任何条款和许可说明,任何人可以任意使用。

《Designing Solutions With COM+ technologies》一书的附赠光碟中有原VB版本的源代码和电子书。该书中文版《COM+技术解决方案设计》已由机械工业出版社出版, 2001.09

最后感谢优快云提供源代码空间

 

WEB技术之四层架构浅谈 如果你的系统是大型的软件开发,那你就要做好更多层的分解,但是原则和理论上,我认为,不用分得太细。我们都知道,MVC模式把系统,分成Model、View、Controller。这样的分法是把表示层同逻辑层分开,也就是说把页面设计师同软件设计师分开。系统分析师再把各个功能写成接口,软件设计师就可以通过业务逻辑来写程序。我所说的四层架构的分法,就是想把软件设计师工作量降下来,减少重复性的代码,提高开发速 阅读详情

相关推荐

三层架构具体实现

<br /> 一提三层架构,大家都知道是表现层(UI),业务逻辑层(BLL)和数据访问层(DAL),而且每层如何细分也都有很多的方法。但具体代码怎么 写,到底那些文件算在哪一层,却是模模糊糊的。下面用一个简单的例子来带领大家实战三层架构的项目,这个例子只有一个功能,就是用户的简单管理。 <br />首先建立一个空白解决方案,添加如下项目及文件 <br />1、添加ASP.NET Web Application项目,命名为UI,新建Web Form类型文件User.aspx(含User.aspx.cs) <b

1150

MVC架构分析

架构分析

qq_45611002的博客 1876

C#中三层架构UI、BLL、DAL、Model实际操作

三层架构分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)再加上实体类库(Model) 转载请注明出自朱朱家园http://blog.youkuaiyun.com/zhgl7688 1、实体类库(Model),主要存放数据库中的表字段。 操作:  (1)先建立实体类库Model,打开项目,在解决方案中右键--》添加--》新建项目--》选中类库--》改名Model--》确定 (2)选

朱朱家园 2万+

C#分层架构

本文详细阐述了C#分层架构的设计与实现,主要包含以下要点: 架构层次:系统分为UI层(用户界面)、BLL层(业务逻辑)、DAL层(数据访问)、IDAL层(接口定义)、Model层(数据实体)和Common层(通用工具),各层职责明确。 核心设计: 严格遵循"上层依赖下层"原则,通过接口实现松耦合 BLL层处理核心业务逻辑,DAL层专注数据操作 采用工厂模式解耦BLL与DAL的依赖关系 关键技术: 实体分类(Entity/ViewModel/DTO) ORM框架使用(如Dapper) 单元

weixin_66547608的博客 1556

C#上位机分层架构设计:表现层→业务层→数据访问层(解耦+可维护性提升)

// PLC通信异常(数据层专用)解耦:各层职责单一,修改某一层不影响其他层(如替换Modbus为OPC UA仅需修改数据层);可维护性:故障定位到具体层/类,维护成本降低80%以上;复用性:业务层/数据层接口可复用到不同上位机项目;扩展性:新增设备/功能仅需实现接口,无需重构核心代码;可测试性:各层独立封装,支持单元测试,提升代码质量。工业落地时需注意:分层架构的核心是“适度分层”,简单项目无需过度设计(如小型上位机可合并业务层与数据层);

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 902

智能问数系统的完整技术栈与实现逻辑

提取并增强数据库 Schema(含业务语义)选择 LLM(开源 qwen2 / 商业 GPT-4o)构建 RAG 向量库(存储历史问法)实现 SQL 安全校验与权限控制添加结果自然语言解释 + 可视化部署到只读数据库环境🔑核心原则“先保证安全,再追求智能”—— 一个能生成错误 SQL 的智能问数系统,比没有更危险。

我们的征途是星辰大海 1621

一个四层应用体系架构 [cboframework c# beta 1 ]

 有关dotnet下的应用体系构架的话题,我们可以明确的从某一点开始,但是可能没有结束的那一点,永远没有:) 一大批原来com+的程序员开始在com和dotnet之间走钢丝,一方面忙于将重点和应用向dotnet构架上转移,一方面还要照顾着原来的com。最后这些程序员将在经历了某一个学习曲线之后坦然的面对两者,掌握了如何分别和两者交互和周旋的技巧。但是问题可能才刚刚开始,因为他们很快开始问这样的问题

648

SolidWorks + AI:利用 DeepSeek AI 自动生成 VBA Macro 宏,实现智能化建模!

本教程介绍如何将集成到插件,实现的自动化操作。通过 DeepSeek AI,您可以快速生成高效的,提升!💡。

SolidWorksAPI的专栏 1万+

C#中三层架构UI、BLL、DAL、Model详解

三层架构分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)再加上实体类库(Model) 转载请注明出自朱朱家园https://blog.youkuaiyun.com/zhgl7688 1、实体类库(Model),主要存放数据库中的表字段。 操作: (1)先建立实体类库Model,打开项目,在解决方案中右键--》添加--》新建项目--》选中类库--》改名Model--》确定 (2)选中M

liutong123987的专栏 6万+

FI 应计对象的创建和摊销

创建/修改:ACACTREE01/ACACTREE02 应计对象的过账:ACACPOSTING

nancyln9711的博客 903

Open5GS实战指南:Ubuntu 22.04环境下的5G核心网快速部署

本文提供Open5GS在Ubuntu 22.04环境下部署5G核心网的实战指南,涵盖环境准备、MongoDB配置、核心组件安装、WebUI部署及网络调优等关键步骤。通过详细的安装教程和常见问题解决方案,帮助开发者快速搭建开源5G核心网测试环境。

weixin_29202213的博客 538

C#的架构、框架、设计模式

包含两层架构、三层架构、接口、反射,以及基于这些技术的简单工厂模式和抽象工厂模式的实现

就随便写写.... 1万+

ADRC自抗扰PD+ESO控制(博途SCL源代码)

文章浏览阅读119次。线性自抗扰控制(LADRC)系统算法框图-优快云博客文章浏览阅读335次。NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-优快云博客本文介绍了如何将ADRC自抗扰控制算法从Simulink仿真应用到PLC控制中,包括Simulink框图、TD微分器模型、MATLAB函数的使用、SCL控制代码,以及非线性状态误差反馈控制率的实现。ADRC自抗扰PD+ESO控制(CODESYS测试+完整ST代码)-优快云博客。

RXXW_Dor的博客 1317

C#五层架构

UI Business Logic Layer Business Rule Layer Data Access Layer Data Definition Layer 简单工厂模式 simple factory 工厂模式 factory 数据库定义视图 请问c#编程五层架构和三层架构有什么区别? 真正含义上只有三层,分别是表示层,逻辑层和数据库访问层,表示层依赖逻辑层,逻辑层依赖...

weixin_30507269的博客 353

ANSYS专题-利用ANSYS SIwave进行PCB板的EMS仿真

本文详细描述了使用ANSYSSIwave进行电路板电磁敏感度(EMS)仿真的完整流程。主要步骤包括:导入AD软件生成的IPC2581文件,检查PCB叠层和电路参数,为敏感网络设置50欧姆端口并指定GND为参考网络,进行验证检查后设置频段范围和入射波类型(单/多入射、极化方式等),最后启动仿真并查看选定网络的EMS感应电压曲线。该过程提供了从文件准备到结果分析的全套操作指南,适用于评估电路板在电磁干扰环境下的性能表现。

whm128的博客 3591

uni-app - 修改默认端口,H5 项目控制台运行出来的 IP 地址的默认端口号(H5 项目运行后控制台,修改项目运行到内置浏览器默认 8080 端口号)

uni-app运行到H5修改默认端口号,uni-app如何修改默认端口,uni-app修改默认端口,uni-app本地运行修改调试已上线微信H5项目,请问在UNIAPP的H5运行调试时候的IP是否可以自己设置固定,uni-app开发环境,如何设置h5服务器的端口,uni-app如何修改默认端,uni-app修改默认端口,uni-app指定端口号,uni-app-修改H5项目控制台运行出来的IP地址的默认端口号(H5项目运行后控制台,修改项目运行到内置浏览器默认8080端口号)

🏆 前端领域优质创作者 9887

在c#中实现3层架构

 原版英文文章地址:http://www.codeproject.com/csharp/three_tier_architecture.asp 介绍这篇文章讨论如何在c#中实现3层架构,使用MS Access数据库存储数据。在此,我在3层架构中实现一个小型的可复用的组件保存客户数据。并提供添加,更新,查找客户数据的功能。背景首先,我介绍一些3层架构的理论知识。简单说明:什么是3层架

.NET技术文章转载博客 1105

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Web五层架构

这篇文章其实是去年我给别人讲Web分层结构时做的一个ppt,只是个人的观点和想法。 1.Model1和Model2 首先,Model1是指JSP+JavaBean。Model1比较适合于一些较小项目,但是,对于现在的情况而言,Model1已经被弃用了。结构如下: 至于Model2是指JSP+Servlet+JavaBean。Model2 出现以后,人们于实际应用过程中发现,其中的 jsp...

GatsbyNewton 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【转】C#中三层架构UI、BLL、DAL、Model详解

三层架构分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)再加上实体类库(Model) 转载请注明出自朱朱家园https://blog.youkuaiyun.com/zhgl7688 1、实体类库(Model),主要存放数据库中的表字段。 操作: (1)先建立实体类库Model,打开项目,在解决方案中右键--》添加--》新建项目--》选中类库--》改名Model--》确定 (2)选中M...

静谧的小码农的博客 1560

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

winform开发框架常见的分层模式

winform开发框架,常见的分层模式,可以分为UI层、BLL层、DAL层、IDAL层、Entity层、公用类库层等等。 这个分层,在Web项目或者WInform项目(包括WPF项目)这些分层都是可以重用的,这样我们就不用重复处理界面一下的逻辑,针对性的开发我们需要的界面层即可。 DAL层根据不同的需要,扩展支持不同的数据库类型,每个数据库类型,对应一个数据库访问实现层即可,它

仙道喵喵的专栏 1万+

第七篇 Winform 教学:好看 UI 框架的应用与实践

虽然 UI 框架提供了丰富的预设样式,但有时仍需根据项目需求进行自定义。大多数框架支持通过修改样式属性、重写绘制方法等方式进行自定义样式设置。例如,在 MaterialSkin 框架中,可以通过继承 MaterialButton 类,重写 OnPaint 方法来自定义按钮的外观。此外,还可以利用框架的扩展性,开发自定义控件或插件,为应用增加独特的功能和界面效果。

毒果的博客 1442
上一篇: 《专栏声音》面向对象简史 (附: dotNET Architect们应该思考的问题)
下一篇: 非技术的新观念:体验经济“倡导者”约瑟夫&#8226;派恩访谈录
ccBoy
博客等级 码龄26年 6粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值