在这篇教程中,我们将会试图弄明白,如何使用多接口与工厂模式去生成一个真正的去耦合架构的框架(a truly decoupled architecture framework)。在例子中我们将会使用一个三级架构,并使用多接口与工厂模式去展示我们如何将一个三级架构转变成一个真正的去耦架构。
以前我曾经写过并录制了一些有关设计模式,UML,FPA,企业模块等等一些视频。你可以在http://www.questpond.com 看到它们。
你可以在 http://www.questpond.com/SampleDotNetInterviewQuestionBook.zip 下载到400本我关于.net FAQ的电子书。
所有人都偏爱三级架构。
ok。大家都知道三级架构是什么。我将会稍微讨论一下它,然后我们开始认真考虑一些有关三级架构的争议之处。基本上我们知道,三级架构中,UI代码 属于客户端部分,业务对象是只是一些有关业务验证的业务类。数据访问层处理所有有关的数据库操作。到这里为止,一切都相当完美。
如果我们分析一下这三个部分,就会注意到很重要的一点,其中的业务验证部分是相当反复无常(高度易变)的。业务规则的改变就相当于业务方式的改变。
第二易变的是客户端部分。人们倾向于多客户端支持,这依赖于用户接口。相对于业务对象来说,这并不是那么反复易变。即使用户想要改变它,也不会急于一时。而业务验证一旦变化则需要即刻的改变。
数据访问是最不常改变的部分。至少在我所有工程项目中,我依然遇到了一些需要经常移动数据库的项目。当一有需要的时候就会被移动,但这不会紧迫,同时它会被作为一个移植项目对待。
因此结论就是,业务部分是最容易频繁更改的,当它发生变化的时候,代码需要即刻进行修正。接下来是UI,最后才是数据库。
控制连锁变化
下面是一个叫做”clsInvoiceHeader”的业务类。你可以看到在代码部分,用户接口直接设定成业务对象。因此用户接口可以直接使用这个类。
clsInvoiceDetail objInvoiceDetail = new clsInvoiceDetail ();
objInvoiceDetail.CustomerName = txtCustomerName.Text;
objInvoiceDetail.CustomerAddress = txtCustomerAddress.Text;
objInvoiceDetail.InvoiceComments = txtComments.Text;
objInvoiceDetail.InvoiceDate=Convert.ToDateTime(txtInvoiceDate.Text);
另一方面,当业务对象连接数据访问层的时候,它会将值以普通的.NET数据类型发送出去。你会看到一个 DAL 部件‘InsertInvoiceDetails’如何发送普通的.NET数据类型。
public class clsInvoiceDetail
{
public void Insert(int _InvoiceReference)
{
clsInvoiceDB objInvoiceDB = new clsInvoiceDB();
objInvoiceDB.InsertInvoiceDetails(_Id, _InvoiceReference, _ProductId, _Qty);
}}
因此,当业务对象发生变化的时候,会发生什么?它会把变化传导到所有的3个层。那意味着你需要重新编译整个工程。
接口与工厂模式的魅力
我们如何在所有的层次之间控制这种连锁反应呢?答案是通过接口与工厂模式。让我们先为‘clsInvoiceDetail’ 类创建一个接口。下面是接口代码。
public interface IInvoiceDetail
{
string InvoiceReferenceNumber
{
get;
}
string CustomerName
{
set;
get;
}
string CustomerAddress
{
set;
get;
}
string InvoiceComments
{
set;
get;
}
DateTime InvoiceDate
{
set;
get;
}}
第二步,我们定义一个类用来创建‘clsInvoiceDetails’对象。下面是同样的代码。
public class FactoryFinance
{
public static IInvoiceDetail getInvoiceDetail()
{
return new clsInvoiceDetail();
}
}
至此,客户只能通过作为代理的接口来引用以及使用工厂来创建具体的类‘ClsInvoiceDetail’。用这种方式,客户并不需要知道具体类 ‘ClsInvoiceDetail’的信息。工厂类的引进是为了避免在客户端引进新的关键字。如果我们在UI中有使用新关键字的客户端,并且UI直接与 具体类信息接触,这会导致严重的耦合。
IInvoiceDetails objInvoiceDetail = FactoryFinance.GetInvoiceDetails();
objInvoiceDetail.CustomerName [...]
分享到:
相关推荐
北大青鸟ACCP5.0 S2 .NET C#三层架构 (三层+实体+简单工厂+接口+反射)框架 代码实例
基于接口的工厂模式多层架构程序
<br>该项目是一个基于接口的工厂模式的三层架构示例解决方案的 Asp.Net 2.0版本。 <br>****************************************************** <br>Database : 该项目所使用的数据库 DEncryptTest ...
北大青鸟ACCP5.0 S2 三层+实体+接口+简单工厂+抽象工厂+公共数据库访问层实例代码
本软件导航菜单使用了微软的iewebcontrols控件,如果不能显示树菜单链接,请安装该控件。 如果win2003系统,还需要将IE的Internet选项的本地Intranet的安全级别调低,以启用控件使用。
北大青鸟ACCP5.0 S2 .NET C#三层架构 三层+实体+简单工厂+接口+反射 代码实例
如题所述,综合运用C#中接口,工厂模式,不过本人对里面有些内容看不懂,比较高深
UserCheck(三层+实体+简单工厂+接口+反射)框架 UserCheck(三层+实体+简单工厂+接口+反射)框架 UserCheck(三层+实体+简单工厂+接口+反射)框架 UserCheck(三层+实体+简单工厂+接口+反射)框架
SchoolManager(三层+实体+接口+简单工厂+抽象工厂+公共数据库访问类)示例C#源码 C#源代码,学习多层开发的最佳示例。
本源码是我开发一个10万行代码软件时使用的架构的进化升级版,使用此架构,可以开发复杂的(操作数据库)WinForm或WebForm程序,相信您在学习这个例子程序的时候,能学到很多项目开发经验,包括接口操作、文件组织、...
Java SE程序 接口实现的工厂模式Java SE程序 接口实现的工厂模式Java SE程序 接口实现的工厂模式Java SE程序 接口实现的工厂模式Java SE程序 接口实现的工厂模式Java SE程序 接口实现的工厂模式Java SE程序 接口实现...
JSP+JavaBean+DAO+面向接口编程+工厂模式实现对数据增删改查,主要是实现封装式调用,方便前web前端对于数据的频繁调用,也就是MVC基本模型,后面我会继续更新,请大家关注喔。
wechat_colorUI_frame:原生微信小程序+ colorUI +接口封装+自定义首页=开箱即用
抽象工厂模式:提供一个接口,用于创建一系列相关的对象,而无需指定具体的类。它适用于需要一次性创建多个相关对象,以形成一个族群。抽象工厂模式通常由抽象工厂、具体工厂、抽象产品和具体产品组成。通过切换...
这个实例用了多重接口 继承 工厂模式 这个实例用了多重接口 继承 工厂模式 这个实例用了多重接口 继承 工厂模式 这个实例用了多重接口 继承 工厂模式
本源码是我开发一个10万行代码软件时使用的架构的进化升级版,使用此架构,可以开发复杂的(操作数据库)WinForm或WebForm程序,相信您在学习这个例子程序的时候,能学到很多项目开发经验,包括接口操作、文件组织、...
Vs2005+Access+Asp.net+Extjs简单三层架构源码 由51编程网站提供,代码由51编程-代码器自动生成。 共生成5种文件格式: Model: 实体层 BLL : 逻辑层 Dal: 数据层(主键自动增长,新增时都需要屏蔽) Ext.aspx: ...
北大青鸟ACCP5.0 S2 .NET C#三层架构 三层+实体+简单工厂+接口 代码实例
SQLca.dbms= ‘OLEDB’ //接口类型 SQLca.AutoCommit = false SQLca.LogPass = logpass SQLca.LogId =logid SQLca.DBParm ="PROVIDER='SQLOLEDB', DATASOURCE='"+serverName+"'," & +"PROVIDERSTRING='Initial ...
通过本例子理解工厂模式和面向接口编程,并更好理解接口的使用