|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我觉得很重要,一般所说的不重要应该指的是:你学好一种以后再学另一种就很容易了。(因为这样大家可能有一个错觉就是语言不是很重要,只要随便学一种就可以了,其实不是这样的。比来在研讨合适团队开辟的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[interfaceFullName];
stringnameSpace=className.Substring(0,className.LastIndexOf("."));
return(T)Assembly.Load(nameSpace).CreateInstance(className);
}
大概有人说
stringnameSpace=className.Substring(0,className.LastIndexOf("."));
这里这个截取是否是以为有点硬,我如今也只想到这个举措,但相对不会有成绩的。
好了,这些也许就是不才这两天的有些劳绩,请指教。
刚刚打开这篇专题,猛然见到HAL9000发表的《对于大型公司项目平台选择j2ee的几层认识》系列,深受启发。 |
|