架构设计之首部曲

架构|设计

系统采用|B/S结构,共分三层,分别是数据访问层,业务规则层,Web外观层。它们各自有自己的职责,各自为政又互相配合从而形成一个软件的整体功能系统,数据访问层的职责是负责对数据源的存取(这里的数据源是指SQL Server 2000),业务规则层负责的是对数据按照业务流程的处理,Web外观层负责向用户提供交互的接口,只负责输入输出数据。这样设计是很普遍的,它提供了一个较好维护的体系。

设计:

1) 数据访问层:

很多人愿意在这一层封装大量的SQL脚本以简化上层的设计,但是这样的设计并不合适!业务一般情况下会有变化,如果把SQL脚本“硬编码”在一起,修改时不得不修改程序的源代码。而用户那里一般只有打包的二进制程序!所以较好的做法是将对数据的操作的脚本放在外面,一般是放在离数据近的地方,如SQL Server上,这里我们把它

编写成存储过程放在SQL Server服务器上。编写成存储过程有这样的两个好处:第一,业务改变时,只要改存储过程即可。第二,没有必要将大量的脚本通过网络传输到数据库服务器解析执行,给网络带来很大的负担。而是只是调用一个存储过程名而已,大大降低了网络负担和中间层的负担。 如:执行添加用户的操作

Create PROCEDURE dbo.User_Create

@RealName varchar(50),

@DeptName varchar(50),

@HashedPassWord varchar(50),

@Tel varchar(50),

@Address varchar(50),

@DutyName varchar(50),

@UserName varchar(50)

AS

begin tran

insert into [User] (UserName,RealName,DeptName,HashedPassWord,Tel,Address,DutyName) values(@UserName,@RealName,@DeptName,@HashedPassWord,@Tel,@Address,@DutyName)

if @@error!=0

begin

rollback

return 0

end

else

begin

commit

return 1

end

对于执行存储过程和维护和数据库连接状态的方法(如:ExecSQL(string SQL),Open())应当封装在一个公共类中共其他类使用,而不是每个类都有自己的数据库方法!这样的意图是可以减少重复依赖,而且如果将这个共享类的方法抽象出来成为一个接口,让所有用到他的类使用这个接口,在共享类发生变化时,使用它的类并不知晓这些变化,减少了依赖就意味着更好地适应变化!

如:

public class Database : IDisposable ,ISQLDataBase(参考于codePlus)

{

private SqlConnection con;

private DBConfig m_Config=DBConfig.Instance;

public int RunProc(string procName)

{

SqlCommand cmd = CreateCommand(procName, null);

cmd.ExecuteNonQuery();

this.Close();

return (int)cmd.Parameters["ReturnValue"].Value;

}

public int RunProc(string procName, SqlParameter[] prams)

{

SqlCommand cmd = CreateCommand(procName, prams);

cmd.ExecuteNonQuery();

this.Close();

return (int)cmd.Parameters["ReturnValue"].Value;

}
.......

}

接口:

public interface ISQLDataBase

{

int RunProc(string procName) ;

int RunProc(string procName, SqlParameter[] prams) ;

void RunProc(string procName, out SqlDataReader dataReader) ;

void RunCommand(string command,out SqlDataReader dataReader);

void RunProc(string procName, SqlParameter[] prams, out SqlDataReader dataReader) ;

SqlCommand CreateCommand(string procName, SqlParameter[] prams) ;

void Open();

void Close() ;

SqlParameter MakeInParam(string ParamName, SqlDbType DbType, int Size, object Value);

SqlParameter MakeOutParam(string ParamName, SqlDbType DbType, int Size);

SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value);

}

对于连接信息,如连接字符串不应在所有用到数据库的地方出现,负责在部署时不得不在所有的类中调整!所以把它方在XML配置文件中是明智的(分成集成和混合安全性),再用一个类管理它即可.

XML文件的内容:

<?xml version="1.0" standalone="yes" ?>

<NewDataSet>

<DBConfig>

<ServerName>Gaolei</ServerName>

<Machine>GAOLEI</Machine>

<DataBase>OA</DataBase>

</DBConfig>

<DBConfig>

<ServerName>Gaolei</ServerName>

<UID>sa</UID>

<PWD></PWD>

<Machine>Gaolei</Machine>

<DataBase>OA</DataBase>

</DBConfig>

<DBConfig>

<LogCount>100</LogCount>

</DBConfig>

</NewDataSet>。

对于数据实体层,它负责传递数据,是各层交换数据的地方。设计时应考虑这样几个因素:

第一:性能,交换数据的地方必须要求交换快、占内存少.

第二:业务规则类可以有效地使用他们。

第三:有利于界面部分使用它们,即要能和用户控件绑定在一起使用,帮助简化界面的开发。

为了满足第一要求,可以将实体的值域上移放在基类中,这样两个类为继承关系又各负各则。基类(数值类)的实例数与其子类(方法类)实例数不成比例,基类实例数总是大于方法实例数,一般是N:1,这样消除了没有必要的内存开支,大大提升了性能。对于有些方法参数列表太长,就可以使用基类对象代替。

方法类集成了常用的数据处理方法,所以一旦业务规则类使用它,可以大大简化规则类的复杂度,设计者可以集中精力设计规则类而不必同时考虑实体类的问题。由于值域上移,把值域做成属性,界面上的控件将天生支持对这些属性的绑定。(.net控件的特性)

实体类:

(数值类)

public class LogRow:MarshalByRefObject,IComparable

{

protected String m_OperateType;

public virtual String OperateType

{

get { return m_OperateType;}

set { m_OperateType=value;}

}

..........

public LogRow()

{// TODO: 在此处添加构造函数逻辑

}

#region IComparable 成员

public int CompareTo(object obj)

{

LogRow Row=(LogRow)obj;

if(Row.Operator.Equals(this.Operator)&&Row.OperateType.Equals(this.OperateType)&&Row.OperateTime.Equals(this.OperateTime)&&Row.Contents.Equals(this.Contents))

return 1;

return 0;

}

#endregion

}

方法类:

public class Log:LogRow

{

public Log()

{

}

public bool Create(String operateType,String contents,String Operator,System.DateTime operateTime)

{

Database data = new Database();

SqlParameter[] prams = {

data.MakeInParam("@OperateType",System.Data.SqlDbType.VarChar,50,operateType),

data.MakeInParam("@Contents",System.Data.SqlDbType.VarChar,255,contents),

data.MakeInParam("@Operator",System.Data.SqlDbType.VarChar,50,Operator),

data.MakeInParam("@OperateTime",System.Data.SqlDbType.DateTime,8,operateTime)

};

int reval = data.RunProc("Log_Create",prams);

data.Close();

data.Dispose();

if(reval==1)

{

return true;

}

else

{

return false;

}

}

public bool Create(LogRow LogObject)

{

return this.Create(LogObject.OperateType,LogObject.Contents,LogObject.Operator,LogObject.OperateTime);

}

public bool Delete(System.DateTime operateTime)

{

Database data = new Database();

SqlParameter[] prams = {

data.MakeInParam("@OperateTime",System.Data.SqlDbType.DateTime,8,operateTime)

};

int reval = data.RunProc("Log_Delete",prams);

data.Close();

data.Dispose();

if(reval==1)

{

return true;

}

else

{

return false;

}

}

.......

}

2) 业务归则层:

要有自己独立的自定义异常类,对于业务方法要适当使用多线程提升性能。最好使用TeampleteMothed模式集成流程和适应未来的业务变化或者将方法设置成virtual!

public class OMManager

{

private User user;

private UserRole userRole;

private Role role;

private RolePopedom rolePopedom;

private string m_CurrentUserName;

private string m_CurrentPassWord;

public OMManager(string CurrentUserName,string CurrentUserEncryptedPassWord)

{

user=new User();

userRole=new UserRole();

role=new Role();

rolePopedom=new RolePopedom();

if((new SecurityValidate()).Validator(CurrentUserName,CurrentUserEncryptedPassWord))

{

this.m_CurrentUserName=CurrentUserName;

this.m_CurrentPassWord=CurrentUserEncryptedPassWord;

}

else

{

throw new SecurityException("无效用户名/密码");

}

}

public virtual string NewUser(UserRow NewUserData, string[] AssignedRoles)

{

string m_HashedPassWord=StringEncryptor.Encryptor(NewUserData.HashedPassWord);

NewUserData.HashedPassWord=m_HashedPassWord;

if(user.Create(NewUserData)&&userRole.Create(NewUserData.UserName,AssignedRoles))

{
//ToDoSomething
}

return null;

}

........}

3)Web界面层:要使用规则层的方法执行业务功能,但并不是什么都要通过规则层,而是数据需要业务处理的就引用规则层方法,如果业务上不需要处理(如:填充一个下拉列表)就可以直接使用数据访问层,这样可以减少没必要的性能开支。对于安全性,就是要使用规则类必须经过验证。对于性能可以使用ASP.Net的缓存技术解决

时间: 2024-09-18 00:36:31

架构设计之首部曲的相关文章

如何实现高容量大并发数据库服务 | 数据库分布式架构设计

袋鼠学院和优云.阿里云联合举办的沙龙结束之后,总是有小伙伴们来问PPT内容,想要进一步了解Topic内容.(哦,对了对了,竟然还有小伙伴专门冲着袋鼠云去听沙龙,感动cry~~) 千呼万唤,忙成狗的袋鼠小妹终于把沙龙总结整理了出来(⊙o⊙) 本次沙龙的主题是"云时代下的运维管理实践",受邀请的演讲嘉宾,花名宏翊(经常关注袋鼠云的同学,肯定已经对这个名字很熟悉了),是袋鼠云首席数据库架构师,袋鼠学院数据库讲师. 呼应沙龙运维实践的主题,结合自己的专长领域,宏翊主要是从数据库领域来谈云时代下

《企业迁云实战》——3.3 应用架构设计

3.3 应用架构设计 上面已经介绍了用户业务上云时如何进行网络设计.运维管理环境规划,本章将重点介绍如何基于阿里云产品和服务设计应用系统架构.3.3.1 负载均衡 阿里云负载均衡(Server Load Balancer,SLB)是将访问流量根据转发策略分发到后端多台ECS的流量分发控制服务.用户可以通过负载均衡的流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性. 阿里云负载均衡主要功能: 负载均衡服务通过设置虚拟服务地址(IP),将多台云服务器ECS实例虚拟成一个高性能

Flume(NG)架构设计要点及配置实践

Flume NG是一个分布式.可靠.可用的系统,它能够将不同数据源的海量日志数据进行高效收集.聚合.移动,最后存储到一个中心化数据存储系统中.由原来的Flume OG到现在的Flume NG,进行了架构重构,并且现在NG版本完全不兼容原来的OG版本.经过架构重构后,Flume NG更像是一个轻量的小工具,非常简单,容易适应各种方式日志收集,并支持failover和负载均衡. 架构设计要点 Flume的架构主要有一下几个核心概念: Event:一个数据单元,带有一个可选的消息头 Flow:Even

【架构篇】Android移动app架构设计浅谈

前言 架构,又名软件架构,是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计. 软件架构设计目标: 1.可靠性(Reliable).软件架构的可靠是产品设计的前提. 2.安全性(Secure).软件架构的安全性是产品可持续发展的条件. 3.可扩展性(Scalable).软件架构必须能够不同的功能需求情况下,支持可扩散性. 4.可定制化(Customizable).同样的一套软件,可以根据客户群的不同和市场需求的变化进行调整. 5.可伸缩 (Extensible).在新技术出现

大型门户网站架构设计的可伸缩性

我们知道,对于一个大型门户网站来说,可伸缩性是非常重要的,怎么样在纵向和横向有良好的可伸缩性,就需要在做架构设计的时候考虑到一个分的原则,我想在多个方面说一下怎么分: 首先是横向的分: 1. 大的网站化解为多个小网站:当我们一个网站有多个功能的时候,可以考虑把这个网站拆分成几个小模块,每一个模块可以是一个网站,这样的话我们到时候就可以很灵活地去把这些网站部署到不同的服务器上. 2. 静态动态分离:静态文件和动态文件最好分离开成2个网站,我们知道静态网站和动态网站对服务器来说压力的侧重不同,前者可

互联网时代的软件革命:SaaS架构设计

前段时间看完了<互联网时代的软件革命:SaaS架构设计>这本书,感触颇深.虽然很多企业早在2000年就搞ASP(Application Service Provider,应用服务提供商),但很少见有人能写书将其中一些知识共享出来,这本书虽然写的比较晚,但也在软件行业做了一件有意义的事情. 从内容上看,此书大致讲述了传统软件和互联网技术相结合的技术架构,以及服务器.群集.缓存.分布式文件系统以及云计算等解决方案.这本书的整体风格较为活泼,借金庸武侠人物虚构一个创业公司的业务来逐步说明问题,让一本

Java文萃:谈软件对项目架构设计的概论

架构|设计|项目 开始之初的架构设计决定着软件产品的生死存亡."好的开始相当于成功一半". 开始的架构设计也是最难的,需要调研同类产品的情况以及技术特征,了解当前世界上对这种产品所能提供的理论支持和技术平台支持.再结合自己项目的特点(需要透彻的系统分析),才能逐步形成自己项目的架构蓝图. 比如要开发网站引擎系统,就从Yahoo的个人主页生成工具 到虚拟主机商提供的网站自动生成系统,以及IBM Webphere Portal的特点和局限 从而从架构设计角度定立自己产品的位置. 好的设计肯

[精华]web架构设计经验分享!

经验|经验分享|精华|设计|web架构 本人作为一位web工程师,着眼最多之处莫过于 性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是这次参会与众同撩交流的心得,有兴趣者可以查看视频 架构设计的几个心得: 一,不要过设计:never over design 这是一个常常被提及的话题,但是只要想想你的架构里有多少功能是根本没有用到,或者最后废弃的,就能明白其重要性了,初涉架构设计,往往倾向于设计大而化 一的架构,希望设计出具有无比扩展

基于Ajax的应用程序架构设计汇总

ajax|程序|架构|设计 1 浏览器端框架被划分成两大类: •应用程序框架:提供浏览器的功能,但是常以包括窗口小部件抽象和另外的部件而出名,其功能主要围绕桌面GUI框架. •基本结构框架:提供基本的管道和可移植的浏览器抽象,让开发者去创建内容.典型的功能: * 针对XMLHttpRequest的包装器以封装浏览器-服务器的交互.(所有的框架都提供这一功能). * XML操作和查询. * 根据来自XMLHttpRequest的应答执行DOM操作. * 在一些情况中,与另外的浏览器端技术如Flas