ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:169.29KB ,
资源ID:3717433      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3717433.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(分享一个Mvc的多层架构.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

分享一个Mvc的多层架构.docx

1、分享一个Mvc的多层架构分享一个Mvc的多层架构,欢迎大家拍砖斧正多层架构是什么?多层架构是开发人员在开发过程当中面对复杂且易变的需求采取的一种以隔离控制为主的应对策略,关于多层架构的标准,我认为有一句话是比较有代表性的“每一层都可以单独部署”,最传统,最简单的就是从三层开始的:将整个项目自下而上的分为:数据持久(数据访问)层,逻辑(业务)层,UI(展现)层。数据访问层:负责将数据持久化响应的数据存储设备上,如DataBase,Txt,Excel等。业务逻辑层:负责处理为满足软件需求而订制的一系列的逻辑与业务,如用户在前端下订单之后,整个业务流可能涉及 到,获取用户信息,获取商品信息,获取购物

2、车信息,验证商品可购买数量是否满足本次购买,针对用户身份产生不同的优惠策略,同时会验证 Cookie,Session等端产生数据的有效性,最终才会产生订单,而订单产生之后会涉及到仓储物流等一系列的Erp系统业务,所有的这一套都属于“下订单”这一需求的业务逻辑。展示层:负责与用户交互的界面,良好的用户体验多是使用在这里。学习过Petshop的话,对于三层都不会陌生:但是随着业务的复杂每一层都会有自己的进化,最终有了无数附加在三层之上的框架与开发思想。Mvc与MVP:首先我一直认为这两种事属于展现层的,“展现层MCV”,“展现层MVP”。然后我们站在展现层的角度思考一下“Mvc”与“MVP”。Mv

3、c:分为model,Controller,View,相信大家对于他已经很熟悉了,在此不再累述。MVP:MVP有Model-Presenter-View三个层次其实在楼主最开始接触Mvc的时候,就在想如果直接通过Controller与Model交互是不是显得有一些“不干净”,因为在楼主眼里“展现层 的Controller”,做得最多的应该就是对于请求路由的不同响应与调用,但是很多的例子会将一些数据验证,去糟的操作过程放在Controller 中,显得不伦不类。当MVP出现的时候,一切满足了楼主的幻想,P的过程就是满足了这一需求,P起到中介的作用,负责接收视图请求,再把结果映射到 view上,P可

4、以不对View做强引用,可通过IView适配多个view。当然我也会在这里做一些针对于终端数据的验证与过滤。业务逻辑:从描述上可以看的很清楚,整个自上而下的结构,最复杂,最可能失控的就是业务逻辑层,因为其中包含着许多的不可控因素,每个行业领域的需求都有可能包含自身的领域知识。于是在之后的多层架构发展构成当中,更多的变化与智慧是体现在这里。领域驱动:限于本人才学不能在这里分享太多,以防误导大家,想了解更多可参考园子里的其他大牛,其实没有3,5 年相关经验是很难理解的,个人感觉如果你不理解的话也不会对你有什么影响,因为领域驱动是建立在良好的面相对象分析,边界划分基础之上的,在学习的过程当 中已经能

5、帮助你去学习到足够多的知识了,最终到不到山巅其实已经无所谓了。简单的说,这个思想最重要的是以业务领域为核心进行发散,期望在变更程序的其他部分,不会影响到领域模型,也就是那句话为了“复杂的系统应用程序中业务规则行为方式(就是“领域逻辑”)是会经常变化的,我们要去拥抱这种变化”。结构图:CQRS:是指命令查询职责的分离,是一个小的模式形态,该模式的关键在于:“一个方法要么是用来改变某个对象的状态的,要么就是返回一个结果,这两者不会同时并存”。将整个系统分拆为两个部分: Commands(命令)- 改变某一个对象或整个系统的状态(有时也叫做modifiers或者mutators)。 Queries(

6、查询)- 返回值并且不会改变对象的状态。架构图:不管DDD也好,CQRS也好,其实这两种都不会100%适合所有的项目架构的,这就需要架构师结合项目本身特点及需求有所选择,但是其中的思想我们可以运用在项目的任何地方。基于消息的分布式:其实不管使用怎样的架构,加入怎样的架构思想(soa),核心或者是开发者最想达到的就是层次,系统之间的解耦,复杂的东西没人会喜欢。随着系统的发展,我们的程序会涉及到多台服务器,多种终端,同时为了解耦我们引入了基于消息的分布式架构。首先,所以系统的通信基于消息,逻辑联系不会涉及到具体的业务实现,同时消息的传递更加的廉价可适配多种终端。其次,由于所用逻辑只是基于消息实现,

7、迭代的成本也会相对于其他耦合项目更快更方便。展示层:随之Web2.0的到来单一页面展示的信息也更加的丰富,Ajax,js的流行也使得Ui端的操作也愈加变重,于是大家有期望以一种工程的思想去拥 抱这种变化,于是MVVM,js的Mvc框架陆续出现。同时随着移动互联网的兴起,不同终端对于系统的对接也非常重要,于是我们考虑在Ui与Logic之 间引入Application或Service层应对不同终端配置。如:我们在Client Presenter Layer 上加入WCF适配多种终端提交的订单,都是建立在消息基础之上的,楼主之前做电商系统是针对于来自淘宝,天猫,亚马逊订单时,为避免出现对库中订单并发

8、, 产生“超买”情况,采用了在上层Ui与logic层之间引入了OrderChannel层,将不同终端订单进行排队的解决方案。以上是架设一个能够适配不同需求的架构过程,但是真正的真理是需要大家在实践中,错误中汲取的。下面是楼主简单的小分层架构,不妥,不足之处希望大家指导斧正。层次划分:为了实现单独部署,层次解耦所以层次之间是基于接口实现的。DataAccess层引入仓储实现统一DTO操作,实现基于Ef:IRepository:1. publicinterfaceIRepositorywhereT:class2. 3. IEnumerableFindAll(ExpressionFuncexp);4

9、. voidAdd(Tentity);5. voidDelete(Tentity);6. voidSubmit();7. 引入RepositoryBase实现接口定义:1. publicclassRepositoryBase:IRepositorywhereT:class2. 3. DbContextcontext;4. publicRepositoryBase(DbContext_context)5. 6. context=_context;7. 8. 9. publicRepositoryBase()10. this.context=newTestDBEntities();11. 12.

10、13. publicIEnumerableFindAll(ExpressionFuncexp)14. 15. returncontext.Set().Where(exp);16. 17. 18. publicvoidAdd(Tentity)19. 20. context.Set().Add(entity);21. 22. 23. publicvoidDelete(Tentity)24. 25. context.Set().Remove(entity);26. 27. 28. publicvoidSubmit()29. 30. context.SaveChanges();31. 32. 这对于单

11、一的某个仓储我们单独引入其自身的仓储接口:1. publicinterfaceIUserRepository:IRepository2. 3. IListGetAllById(intid);4. 5. boolCheckUserExist(UserTestu);6. 特定仓储实现:1. publicclassUserRepository:RepositoryBase,IUserRepository2. 3. publicIListGetAllById(intid)4. 5. using(TestDBEntitiesentities=newTestDBEntities()6. 7. varuse

12、rs=fromuinentities.UserTests8. whereu.ID=id9. selectu;10. returnusers.ToList();11. 12. 13. 14. publicboolCheckUserExist(UserTestu)15. 16. using(TestDBEntitiesentities=newTestDBEntities()17. 18. Listusers=entities.UserTests.Where(ut=ut.UserName=u.UserName&ut.UserPassword=u.UserPassword).ToList();19.

13、returnusers.Count=0?false:true;20. 21. 22. 在Service层同样建立相关接口适配特种服务:IUserCore:1. publicinterfaceIUserCore2. 3. CommandStatueEnumUserLogin(IModelmodel);4. CommandStatueEnumUserRegister(IModelmodel);5. 6. ListGetUsers(ExpressionFuncexpr);7. UserCore:1. publicclassUserCore:IUserCore2. 3. #regionStructur

14、e4. IUserRepository_repository;5. publicUserCore(IUserRepositoryrepository)6. this._repository=repository;7. 8. #endregion9. 10. publicCommandStatueEnumUserLogin(IModelmodel)11. 12. try13. 14. UserLoginu=modelasUserLogin;15. UserTestuTest=newUserTest();16. uTest.UserName=u.UserName;17. uTest.UserPas

15、sword=u.Password;18. 19. if(_repository.CheckUserExist(uTest)20. 21. returnCommandStatueEnum.Succeed;22. 23. else24. 25. returnCommandStatueEnum.Fail;26. 27. 28. catch(Exceptionex)29. throwex;30. 31. 32. 33. publicCommandStatueEnumUserRegister(IModelmodel)34. 35. try36. 37. UserLoginu=modelasUserLog

16、in;38. UserTestuTest=newUserTest()UserName=u.UserName,UserPassword=u.Password;39. _repository.Add(uTest);40. _repository.Submit();41. returnCommandStatueEnum.Succeed;42. 43. catch(Exceptionex)44. 45. throwex;46. 47. 48. 49. 50. publicListGetUsers(System.Linq.Expressions.ExpressionFuncexpr=null)51. 5

17、2. return_repository.FindAll(expr).ToList();53. 54. Controller:1. publicclassAccountController:Controller2. 3. IUserCoreuserCore;4. publicAccountController(IUserCore_userCore)5. 6. this.userCore=_userCore;7. 8. 9. /10. /GET:/Account/11. 12. #regionview13. publicActionResultHome()14. 15. ViewBag.User

18、s=userCore.GetUsers(u=u.IsUse=1);16. returnView();17. 18. 19. publicActionResultLogin()20. 21. returnView();22. 23. 24. publicActionResultRegister()25. 26. returnView();27. 28. #endregion29. 30. #regionPost31. HttpPost32. publicActionResultLogin(UserLoginaccount)33. 34. try35. 36. if(userCore.UserLo

19、gin(account)=CommandStatueEnum.Succeed)37. 38. returnRedirectToAction(Home);39. 40. else41. 42. returnView();43. 44. 45. catch(Exceptionex)46. 47. ExceptionModel.IsExcept=true;48. ExceptionModel.Exception=ex.ToString();49. ExceptionModel.CreateTime=DateTime.Now;50. returnView();51. 52. 53. 54. HttpP

20、ost55. publicActionResultRegister(UserLoginaccount)56. 57. try58. 59. if(userCore.UserRegister(account)=CommandStatueEnum.Succeed)60. 61. returnRedirectToAction(Home);62. 63. else64. 65. returnView();66. 67. 68. catch(Exceptionex)69. 70. ExceptionModel.IsExcept=true;71. ExceptionModel.Exception=ex.T

21、oString();72. ExceptionModel.CreateTime=DateTime.Now;73. returnView();74. 75. 76. #endregion77. 对于接口之间我们通过引入IOC工具解耦:1. publicclassMvcApplication:System.Web.HttpApplication2. 3. protectedvoidApplication_Start()4. 5. AreaRegistration.RegisterAllAreas();6. 7. WebApiConfig.Register(GlobalConfiguration.C

22、onfiguration);8. FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);9. RouteConfig.RegisterRoutes(RouteTable.Routes);10. BundleConfig.RegisterBundles(BundleTable.Bundles);11. AuthConfig.RegisterAuth();12. 13. #regionIOC14. varbuilder=newContainerBuilder();15. SetupResolveRules(builder);16. buil

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1