ASP.NET教程之基于asp.net的Web开辟架构探究
我觉得很重要,一般所说的不重要应该指的是:你学好一种以后再学另一种就很容易了。(因为这样大家可能有一个错觉就是语言不是很重要,只要随便学一种就可以了,其实不是这样的。比来在研讨合适团队开辟的web架构办理计划,该架构即要合适合作合作又要有必定扩大性,合适分歧的数据库必要,因而我查阅了一些材料,开端构思出了一套架构,请列位多多指教。成绩由来比来在研讨合适团队开辟的web架构办理计划,该架构即要合适合作合作又要有必定扩大性,合适分歧的数据库必要,因而我查阅了一些材料,开端构思出了一套架构,请列位多多指教。
探究
web开辟架构最典范莫过于三层架构,暗示层、逻辑层、数据处置层。
数据会见层:其功效次要是卖力数据库的会见。
营业逻辑层:是全部体系的中心,它与这个体系的营业(范畴)有关。
暗示层:是体系的UI部分,卖力利用者与全部体系的交互。幻想的形态是暗示层不该包含体系的营业逻辑。
这些是典范的注释,假如要合适分歧的数据库则必要到场工场形式,内里用面向接口的体例举行多态挪用。是否是这有点像petshop了。以是架构的开端假想是如许:
上面以猎取用户信息为例,简述这个架构的流程:(以下为相似petshop的典范做法,懂得的能够略过)
step1、起首我们应当创建项目所需的实体模子,在这里新建用户信息的实体形式,UserInfo.cs。该类保留在Model项目里。
step2、我们再将项目标单位功效写到相干的接口中,这里以猎取用户信息功效为例。在IDAL项目里新建IUser接口。
//依据用户ID猎取用户信息
UserInfoGetUserById(intuserId);
step3、完成了接口,我们就要完成它,如今我们用sqlserver、oracle两种数据库会见体例来完成它。以下是SqlserverDAL中User类对接口的实际:
publicclassUser:IUser
{
publicUserInfoGetUserById(intuserId)
{
//完成操纵
}
}
OracleDAL中实际体例相似。。。。
step4、在此数据库会见层应当就基础写好了,上面应当给逻辑层挪用了,可是两种完成体例怎样挪用呢,大概说怎样有选择的挪用它呢,petshop是如许处置的,在DALFactory中的DataAccess类,使用反射载进程序集从而实例化所必要的类:
privatestaticreadonlystringpath=ConfigurationManager.AppSettings["WebDAL"];
publicstaticIUserCreateUser()
{
stringclassName=path+".User";
return(IUser)Assembly.Load(path).CreateInstance(className);
}
至于要选择哪一个数据库会见层,在设置文件里设置一下WebDAL。如:<addkey="WebDAL"value="SQLServerDAL"/>。
如许就基础办理了逻辑层和数据会见层的耦合。
step5、上面就该写逻辑层了,在BLL内里创立User.cs类。大抵以下:
publicclassUser
{
privatestaticreadonlyIUserdal=DALFactory.DataAccess.CreateUser();
publicUserInfoGetUserInfo(intuserId){
returndal.GetUserById(userId);
}
}
是否是以为BLL毫偶然义,由于它只是对数据会见层办法的复杂挪用,但并非如许的,这里只要一个复杂的事例,在实践项目中一个BLL内里处置的多是一个十分庞大的逻辑,而这个庞大逻辑的了局才供应给暗示层显现。
step6、最初是暗示层,仿佛没甚么可说的,把从BLL掏出来的数据绑定到你的页面就好了。
以上是仿petshop的架构计划,看起来没甚么质疑的中央,究竟是微软的典范案例。你大概埋怨的中央有两点,一是层是否是有点多,干系过于庞大;二假如我必要改动或增添一个数据库字段,那不是会很疾苦,由于要节联修正。这两个成绩,我都没举措办理,一假如说过于层过于多而烦琐,那末上面我写的仿佛更加庞大,包涵。。。。2、不才以为但凡分层开辟,只需以数据库字段为根据的创建实体模子,城市存在节联修正的成绩。除非全体用DataTable,那末在BLL、暗示层挪用的时分其实不晓得DataTable究竟装有甚么,如许无疑加倍了挪用的方便利。关于削减节联修正的成绩,若有办理办法的请指教。
对以上架构的修正
我重点剖析了以上架构的数据会见工场的计划部分,即DALFactory中的DataAccess类。在此类中,完成了对分歧数据库会见层的挪用
。但假如如今有一个项目,内里有sqlserver又有oracle的实际,我们是否是要如许做:
privatestaticreadonlystringpath=ConfigurationManager.AppSettings["WebDAL"];//对sqlserver数据库会见层的挪用
privatestaticreadonlystringpath2=ConfigurationManager.AppSettings["WebDAL2"];//对oracel数据库会见层的挪用
publicstaticIUserCreateUser()
{
stringclassName=path+".User";
return(IUser)Assembly.Load(path).CreateInstance(className);
}
publicstaticIOrderCreateOrder()
{
stringclassName=path2+".Order";
return(IUser)Assembly.Load(path2).CreateInstance(className);
}
假如要创立其他的会见类,我们还要写CreateProduct(),CreateArticle,CreateMenu。。。。。那末如许的类会很烦琐,我们能不克不及
只做一个办法,其他的事情只必要开辟职员经由过程设置文件来完成呢。我的办理计划有两个:
1、Spring.net
这个器材就是专门用来解耦合的,我们将它的相干程序集加载到DALFactory中,因而在DataAccess中,我们能够做:
privatestaticreadonlystringconfigPath=HttpContext.Current.Request.PhysicalApplicationPath+
ConfigurationManager.AppSettings["objectconfig"];//这是spring.net的工具设置文件在服务器上的物理地位
publicstaticTCreateObject<T>()
{
IResourcers=newFileSystemResource(configPath);
IObjectFactoryfactory=newXmlObjectFactory(rs);
stringid=typeof(T).FullName;
return(T)factory.GetObject(id);
}
这里我们传进一个泛型,让spring.net在它的工具设置文件内里找到该范例的程序集并加载,创立出对应的工具。objectconfig文件
大抵以下:
<?xmlversion="1.0"encoding="utf-8"?>
<objectsxmlns="http://www.springframework.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.net
http://www.springframework.net/xsd/spring-objects.xsd">
<objectid="IDAL.IUser"type="SQLServerDAL.Function"></object>
</objects>
如许在BLL就如许挪用
privatestaticreadonlyIUserdal=EtourAF.Shared.DALFactory.DataAccess.CreateObject<IUser>();
如许开辟职员假如要到场一个工具就在object-config中加一段相干设置就好了。嘿嘿,这就酿成了petshop+spring.net了,YY无极限。。。。
2、也是用反射
这里我们只是用了一个键值对的体例,按例在设置文件里设置响应的接口和工具,只是我们把他设置到了web.config傍边:
<addkey="IDAL.IUser"value="SQLServerDAL.Function"/>
在DataAccess中,我们就如许写:
publicstaticTCreateObject<T>()
{
stringinterfaceFullName=typeof(T).FullName;
stringclassName=ConfigurationManager.AppSettings;
stringnameSpace=className.Substring(0,className.LastIndexOf("."));
return(T)Assembly.Load(nameSpace).CreateInstance(className);
}
大概有人说
stringnameSpace=className.Substring(0,className.LastIndexOf("."));
这里这个截取是否是以为有点硬,我如今也只想到这个举措,但相对不会有成绩的。
好了,这些也许就是不才这两天的有些劳绩,请指教。
刚刚打开这篇专题,猛然见到HAL9000发表的《对于大型公司项目平台选择j2ee的几层认识》系列,深受启发。 同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。 Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。 Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境! 提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。 可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。 主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。 但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。 代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
页:
[1]