版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MVC的多层架构实例多层架构是什么?多层架构是开发人员在开发过程当中面对复杂且易变的需求采取的一种以隔离控制为主的应对策略,关于多层架构的标准,我认为有一句话是比较有代表性的每一层都可以单独部署”,最传统,最简单的就是从三层开始的:将整个项目自下而上的分为:数据持久(数据访问)层,逻辑(业务)层,UI(展现)层。数据访问层:负责将数据持久化响应的数据存储设备上,如DataBase,Txt,Excel等。业务逻辑层:负责处理为满足软件需求而订制的一系列的逻辑与业务,如用户在前端下订单之后,整个业务流可能涉及至L获取用户信息,获取商品信息,获取购物车信息,验证商品可购买数量是否满足本次购买,针对用
2、户身份产生不同的优惠策略,同时会验证Cookie,Session等端产生数据的有效性,最终才会产生订单,而订单产生之后会涉及到仓储物流等一系列的Erp系统业务,所有的这一套都属于下订单”这一需求的业务逻辑。展示层:负责与用户交互的界面,良好的用户体验多是使用在这里。学习过Petshop的话,对于三层都不会陌生:但是随着业务的复杂每一层都会有自己的进化,最终有了无数附加在三层之上的框架与开发思想。MVC与MVP:首先我一直认为这两种事属于展现层的,展现层MCV,展现层MVP。然后我们站在展现层的角度思考一下“MvC与"MVP。Mvc:分为model,Controller,View,相信
3、大家对于他已经很熟悉了,在此不再累述。MVP: MVP 有 Model-Presenter-View 三个层次OOi1ii*LQ. !融青/1牛什6-1.2Jr 一返回c*i.3向控一鼎鹿YOQCent rollorMode»i1ii|i(11nii1a1,Hii1ildialinmlm1交通求o ; « j ©血阚接口).1w叱11 业务逻辑:从描述上可以看的很清楚,整个自上而下的结构,最复杂,最可能失控的就是业务逻辑层,因为其中包含着许多的不可控因素,每个行业领域的需求都有可能包含自身的领域知识。于是在之后的多层架构发展构成当中,更多的变化与智慧是体现在这里。
4、领域驱动:限于本人才学不能在这里分享太多,以防误导大家,想了解更多可参考园子里的其他大牛,其实没有3,5年相关经验是很难理解的,个人感觉如果你不理解的话也不边界划分基础之上的,在会对你有什么影响,因为领域驱动是建立在良好的面相对象分析,学习的过程当中已经能帮助你去学习到足够多的知识了,最终到不到山巅其实已经无所谓了。期望在变更程序的其他部简单的说,这个思想最重要的是以业务领域为核心进行发散,分,不会影响到领域模型,也就是那句话为了复杂的系统应用程序中业务规则行为方式(就是领域逻辑”)是会经常变化的,我们要去拥抱这种变化结构图:用户界面Web服务网络边界表现层基础结构层User Interfac
5、eCommandsCommand BusCommand J LCommand Handler基础结构层CQRSM指命令查询职责的分离,是一个小的模式形态,该模式的关键在于:1个方法要么是用来改变某个对象的状态的,要么就是返回一个结果,这两者不会同时并存将整个系统分拆为两个部分:Commands(命令)-改变某一个对象或整个系统的状态(有时也叫做modifiers或者mutators)。Queries(查询)-返回值并且不会改变对象的状态。架构图:不管DDD也好,CQRS也好,其实这两种都不会100%适合所有的项目架构的,这就需要架构师结合项目本身特点及需求有所选择,但是其中的思想我们可以运用在
6、项目的任何地方。基于消息的分布式:其实不管使用怎样的架构,加入怎样的架构思想(soa),核心或者是开发者最想达到的就是层次,系统之间的解耦,复杂的东西没人会喜欢。随着系统的发展,我们的程序会涉及到多台服务器,多种终端,同时为了解耦我们引入了基于消息的分布式架构。首先,所以系统的通信基于消息,逻辑联系不会涉及到具体的业务实现,同时消息的传递更加的廉价可适配多种终端。其次,由于所用逻辑只是基于消息实现,迭代的成本也会相对于其他耦合项目更快更方便。Client/ServerRMIArchitecture展示层:随之Web2.0的到来单一页面展示的信息也更加的丰富,Ajax,js的流行也使得Ui端的操
7、作也愈加变重,于是大家有期望以一种工程的思想去拥抱这种变化,于是MVVM,js的Mvc框架陆续出现。同时随着移动互联网的兴起,不同终端对于系统的对接也非常重要,于是我们考虑在Ui与Logic之间引入Application或Service层应对不同终端配置。如:我们在ClientPresenterLayer上加入WCF适配多种终端提交的订单,都是建立在消息基础之上的,楼主之前做电商系统是针对于来自淘宝,天猫,亚马逊订单时,为避免出现对库中订单并发,产生超买”情况,采用了在上层Ui与logic层之间引入了OrderChannel层,将不同终端订单进行排队的解决方案。以上是架设一个能够适配不同需求的
8、架构过程,但是真正的真理是需要大家在实践中,错误中汲取的。下面是楼主简单的小分层架构,不妥,不足之处希望大家指导斧正。层次划分:©Solution'N-Layer'7projects)1 1.Foundation>ConnectDBb回N-layer.FoundationZ.DataAccess画N-layer.Repository> AProperties> References> Abstract> Impl归packages.config> 相TwtEBEritity.edmx,Core-Business»叵N-La
9、yEr.Applic3tion到N-layer.Core> AProperties> References> Domain> Interface> Model*4.UI司N-Layer.WebSiteUTestD国N-LayerJert为了实现单独部署,层次解耦所以层次之间是基于接口实现的。DataAccess层引入仓储实现统一DTO操作,实现基于Ef:IRepository:publicinterfaceIRepository<T>whereT:classIEnumerable<T>FindAll(Expression<Func&l
10、t;T,bool>>exp);voidAdd(Tentity);voidDelete(Tentity);voidSubmit。;引入RepositoryBase实现接口定义:publicclassRepositoryBase<T>:IRepository<T>whereT:classDbContextcontext;publicRepositoryBase(DbContext_context)context=_context;publicRepositoryBase()this.context=newTestDBEntities();publicIEnume
11、rable<T>FindAll(Expression<Func<T,bool>>exp)returncontext.Set<T>().Where(exp);publicvoidAdd(Tentity)context.Set<T>().Add(entity);publicvoidDelete(Tentity)context.Set<T>().Remove(entity);publicvoidSubmit()context.SaveChanges();这对于单一的某个仓储我们单独引入其自身的仓储接口:publicinterfa
12、ceIUserRepository:IRepository<UserTest>IList<UserTest>GetAllById(intid);boolCheckUserExist(UserTestu);特定仓储实现:publicclassUserRepository:RepositoryBase<UserTest>,IUserRepositorypublicIList<UserTest>GetAllById(intid)using(TestDBEntitiesentities=newTestDBEntities()varusers=fromui
13、nentities.UserTestswhereu.ID=idselectu;returnusers.ToList();publicboolCheckUserExist(UserTestu)using(TestDBEntitiesentities=newTestDBEntities()List<UserTest>users=entities.UserTests.Where(ut=>ut.UserName=u.UserName&&ut.UserPassword=u.UserPassword).ToList<UserTest>();returnuser
14、s.Count=0?false:true;在Service层同样建立相关接口适配特种服务:IUserCore:publicinterfaceIUserCoreCommandStatueEnumUserLogin(IModelmodel);CommandStatueEnumUserRegister(IModelmodel);List<UserTest>GetUsers(Expression<Func<UserTest,bool>>expr);UserCore:publicclassUserCore:IUserCore#regionStructureIUserR
15、epository_repository;publicUserCore(IUserRepositoryrepository)this._repository=repository;#endregionpublicCommandStatueEnumUserLogin(IModelmodel)tryUserLoginu=modelasUserLogin;UserTestuTest=newUserTest();uTest.UserName=u.UserName;uTest.UserPassword=u.Password;if(_repository.CheckUserExist(uTest)retu
16、rnCommandStatueEnum.Succeed;elsereturnCommandStatueEnum.Fail;catch(Exceptionex)throwex;publicCommandStatueEnumUserRegister(IModelmodel)tryUserLoginu=modelasUserLogin;UserTestuTest=newUserTest()UserName=u.UserName,UserPassword=u.Password;_repository.Add(uTest);_repository.Submit();returnCommandStatue
17、Enum.Succeed;catch(Exceptionex)throwex;publicList<UserTest>GetUsers(System.Linq.Expressions.Expression<Func<UserTest,bool>>expr=null)return_repository.FindAll(expr).ToList<UserTest>();Controller:publicclassAccountController:ControllerIUserCoreuserCore;publicAccountController(
18、IUserCore_userCore)this.userCore=_userCore;/GET:/Account/#regionviewpublicActionResultHome()ViewBag.Users=userCore.GetUsers(u=>u.IsUse=1);returnView();publicActionResultLogin()returnView();publicActionResultRegister()returnView();#endregion#regionPostHttpPostpublicActionResultLogin(UserLoginaccou
19、nt)tryif(userCore.UserLogin(account)=CommandStatueEnum.Succeed)returnRedirectToAction("Home");elsereturnView();catch(Exceptionex)ExceptionModel.IsExcept=true;ExceptionModel.Exception=ex.ToString();ExceptionModel.CreateTime=DateTime.Now;returnView();HttpPostpublicActionResultRegister(UserLo
20、ginaccount)tryif(userCore.UserRegister(account)=CommandStatueEnum.Succeed)returnRedirectToAction("Home");elsereturnView();catch(Exceptionex)ExceptionModel.IsExcept=true;ExceptionModel.Exception=ex.ToString();ExceptionModel.CreateTime=DateTime.Now;returnView();#endregion对于接口之间我们通过引入IOC工具解耦:publicclassMvcApplication:System.Web.HttpApplicationprotectedvoidApplication_Start()AreaRegistration.RegisterAllAreas();WebApiConfig.Register(GlobalConfiguration.Configuration);FilterConfig.RegisterG
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 转账佣金合同
- 建筑工程劳务承包合同
- 恭城租房合同
- 2025年中考生物押题试卷:六2025年级考前冲刺
- 空场地租赁合同
- 翻新沙发合同
- 成都上小学劳动合同
- 2026年云南财经职业学院单招职业适应性测试题库必考题
- 2026年南充电影工业职业学院单招综合素质考试题库及答案1套
- 2026年九江职业大学单招职业技能测试题库必考题
- (完整)机械制造工艺学试题及答案
- 海上风电基础知识培训课件
- 数字经济知识培训内容课件
- 2025年医疗器械临床试验质量管理规范培训考试试题及答案
- 国际道路应急预案
- 人防指挥所信息化建设方案
- 生死疲劳阅读报告课件
- 胸椎管狭窄症诊疗规范
- 2025年银行从业资格考试真题试卷:银行财务会计案例分析
- 2025年国家管网集团高校毕业生招聘945人正式启动笔试参考题库附带答案详解
- 夜班护士安全培训内容课件
评论
0/150
提交评论