自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分享一個(gè)MVC的多層架構(gòu),歡迎大家拍磚斧正

開發(fā) 架構(gòu) 后端
多層架構(gòu)是開發(fā)人員在開發(fā)過程當(dāng)中面對(duì)復(fù)雜且易變的需求采取的一種以隔離控制為主的應(yīng)對(duì)策略,關(guān)于多層架構(gòu)的標(biāo)準(zhǔn),我認(rèn)為有一句話是比較有代表性的“每一層都可以單獨(dú)部署”,最傳統(tǒng),最簡單的就是從三層開始的。

多層架構(gòu)是什么?

多層架構(gòu)是開發(fā)人員在開發(fā)過程當(dāng)中面對(duì)復(fù)雜且易變的需求采取的一種以隔離控制為主的應(yīng)對(duì)策略,關(guān)于多層架構(gòu)的標(biāo)準(zhǔn),我認(rèn)為有一句話是比較有代表性的“每一層都可以單獨(dú)部署”,最傳統(tǒng),最簡單的就是從三層開始的:

將整個(gè)項(xiàng)目自下而上的分為:數(shù)據(jù)持久(數(shù)據(jù)訪問)層,邏輯(業(yè)務(wù))層,UI(展現(xiàn))層。

數(shù)據(jù)訪問層:負(fù)責(zé)將數(shù)據(jù)持久化響應(yīng)的數(shù)據(jù)存儲(chǔ)設(shè)備上,如DataBase,Txt,Excel等。

業(yè)務(wù)邏輯層:負(fù)責(zé)處理為滿足軟件需求而訂制的一系列的邏輯與業(yè)務(wù),如用戶在前端下訂單之后,整個(gè)業(yè)務(wù)流可能涉及到,獲取用戶信息,獲取商品信息,獲取購物車信息,驗(yàn)證商品可購買數(shù)量是否滿足本次購買,針對(duì)用戶身份產(chǎn)生不同的優(yōu)惠策略,同時(shí)會(huì)驗(yàn)證Cookie,Session等端產(chǎn)生數(shù)據(jù)的有效性,最終才會(huì)產(chǎn)生訂單,而訂單產(chǎn)生之后會(huì)涉及到倉儲(chǔ)物流等一系列的Erp系統(tǒng)業(yè)務(wù),所有的這一套都屬于“下訂單”這一需求的業(yè)務(wù)邏輯。

展示層:負(fù)責(zé)與用戶交互的界面,良好的用戶體驗(yàn)多是使用在這里。

學(xué)習(xí)過Petshop的話,對(duì)于三層都不會(huì)陌生:

但是隨著業(yè)務(wù)的復(fù)雜每一層都會(huì)有自己的進(jìn)化,最終有了無數(shù)附加在三層之上的框架與開發(fā)思想。

Mvc與MVP:

首先我一直認(rèn)為這兩種事屬于展現(xiàn)層的,“展現(xiàn)層MCV”,“展現(xiàn)層MVP”。

然后我們站在展現(xiàn)層的角度思考一下“Mvc”與“MVP”。

Mvc:分為model,Controller,View,相信大家對(duì)于他已經(jīng)很熟悉了,在此不再累述。

MVP:MVP有Model-Presenter-View三個(gè)層次

其實(shí)在樓主最開始接觸Mvc的時(shí)候,就在想如果直接通過Controller與Model交互是不是顯得有一些“不干凈”,因?yàn)樵跇侵餮劾?ldquo;展現(xiàn)層的Controller”,做得最多的應(yīng)該就是對(duì)于請(qǐng)求路由的不同響應(yīng)與調(diào)用,但是很多的例子會(huì)將一些數(shù)據(jù)驗(yàn)證,去糟的操作過程放在Controller中,顯得不倫不類。當(dāng)MVP出現(xiàn)的時(shí)候,一切滿足了樓主的幻想,P的過程就是滿足了這一需求,P起到中介的作用,負(fù)責(zé)接收視圖請(qǐng)求,再把結(jié)果映射到view上,P可以不對(duì)View做強(qiáng)引用,可通過IView適配多個(gè)view。當(dāng)然我也會(huì)在這里做一些針對(duì)于終端數(shù)據(jù)的驗(yàn)證與過濾。

業(yè)務(wù)邏輯:

從描述上可以看的很清楚,整個(gè)自上而下的結(jié)構(gòu),最復(fù)雜,最可能失控的就是業(yè)務(wù)邏輯層,因?yàn)槠渲邪S多的不可控因素,每個(gè)行業(yè)領(lǐng)域的需求都有可能包含自身的領(lǐng)域知識(shí)。于是在之后的多層架構(gòu)發(fā)展構(gòu)成當(dāng)中,更多的變化與智慧是體現(xiàn)在這里。

領(lǐng)域驅(qū)動(dòng):限于本人才學(xué)不能在這里分享太多,以防誤導(dǎo)大家,想了解更多可參考園子里的其他大牛,其實(shí)沒有3,5年相關(guān)經(jīng)驗(yàn)是很難理解的,個(gè)人感覺如果你不理解的話也不會(huì)對(duì)你有什么影響,因?yàn)轭I(lǐng)域驅(qū)動(dòng)是建立在良好的面相對(duì)象分析,邊界劃分基礎(chǔ)之上的,在學(xué)習(xí)的過程當(dāng)中已經(jīng)能幫助你去學(xué)習(xí)到足夠多的知識(shí)了,最終到不到山巔其實(shí)已經(jīng)無所謂了。

簡單的說,這個(gè)思想最重要的是以業(yè)務(wù)領(lǐng)域?yàn)楹诵倪M(jìn)行發(fā)散,期望在變更程序的其他部分,不會(huì)影響到領(lǐng)域模型,也就是那句話為了“復(fù)雜的系統(tǒng)應(yīng)用程序中業(yè)務(wù)規(guī)則行為方式(就是“領(lǐng)域邏輯”)是會(huì)經(jīng)常變化的,我們要去擁抱這種變化”。結(jié)構(gòu)圖:

CQRS:是指命令查詢職責(zé)的分離,是一個(gè)小的模式形態(tài),該模式的關(guān)鍵在于:“一個(gè)方法要么是用來改變某個(gè)對(duì)象的狀態(tài)的,要么就是返回一個(gè)結(jié)果,這兩者不會(huì)同時(shí)并存”。將整個(gè)系統(tǒng)分拆為兩個(gè)部分:

  • Commands(命令) - 改變某一個(gè)對(duì)象或整個(gè)系統(tǒng)的狀態(tài)(有時(shí)也叫做modifiers或者mutators)。
  • Queries(查詢) - 返回值并且不會(huì)改變對(duì)象的狀態(tài)。

架構(gòu)圖:

不管DDD也好,CQRS也好,其實(shí)這兩種都不會(huì)100%適合所有的項(xiàng)目架構(gòu)的,這就需要架構(gòu)師結(jié)合項(xiàng)目本身特點(diǎn)及需求有所選擇,但是其中的思想我們可以運(yùn)用在項(xiàng)目的任何地方。

基于消息的分布式:

其實(shí)不管使用怎樣的架構(gòu),加入怎樣的架構(gòu)思想(soa),核心或者是開發(fā)者最想達(dá)到的就是層次,系統(tǒng)之間的解耦,復(fù)雜的東西沒人會(huì)喜歡。

隨著系統(tǒng)的發(fā)展,我們的程序會(huì)涉及到多臺(tái)服務(wù)器,多種終端,同時(shí)為了解耦我們引入了基于消息的分布式架構(gòu)。

首先,所以系統(tǒng)的通信基于消息,邏輯聯(lián)系不會(huì)涉及到具體的業(yè)務(wù)實(shí)現(xiàn),同時(shí)消息的傳遞更加的廉價(jià)可適配多種終端。

其次,由于所用邏輯只是基于消息實(shí)現(xiàn),迭代的成本也會(huì)相對(duì)于其他耦合項(xiàng)目更快更方便。

展示層:

隨之Web2.0的到來單一頁面展示的信息也更加的豐富,Ajax,js的流行也使得Ui端的操作也愈加變重,于是大家有期望以一種工程的思想去擁抱這種變化,于是MVVM,js的Mvc框架陸續(xù)出現(xiàn)。同時(shí)隨著移動(dòng)互聯(lián)網(wǎng)的興起,不同終端對(duì)于系統(tǒng)的對(duì)接也非常重要,于是我們考慮在Ui與Logic之間引入Application或Service層應(yīng)對(duì)不同終端配置。

如:我們在Client Presenter Layer 上加入WCF適配多種終端提交的訂單,都是建立在消息基礎(chǔ)之上的,樓主之前做電商系統(tǒng)是針對(duì)于來自淘寶,天貓,亞馬遜訂單時(shí),為避免出現(xiàn)對(duì)庫中訂單并發(fā),產(chǎn)生“超買”情況,采用了在上層Ui與logic層之間引入了OrderChannel層,將不同終端訂單進(jìn)行排隊(duì)的解決方案。

以上是架設(shè)一個(gè)能夠適配不同需求的架構(gòu)過程,但是真正的真理是需要大家在實(shí)踐中,錯(cuò)誤中汲取的。

下面是樓主簡單的小分層架構(gòu),不妥,不足之處希望大家指導(dǎo)斧正。

#p#

層次劃分:

為了實(shí)現(xiàn)單獨(dú)部署,層次解耦所以層次之間是基于接口實(shí)現(xiàn)的。

DataAccess層引入倉儲(chǔ)實(shí)現(xiàn)統(tǒng)一DTO操作,實(shí)現(xiàn)基于Ef:

IRepository:

  1. public interface IRepository<T> where T:class 
  2.     {  
  3.         IEnumerable<T> FindAll(Expression<Func<T,bool>> exp);  
  4.         void Add(T entity);  
  5.         void Delete(T entity);  
  6.         void Submit();  
  7.     } 

引入RepositoryBase實(shí)現(xiàn)接口定義:

  1. public class RepositoryBase<T>:IRepository<T> where T:class 
  2.     {  
  3.         DbContext context;  
  4.         public RepositoryBase(DbContext _context)  
  5.         {  
  6.             context = _context;  
  7.         }  
  8.  
  9.         public RepositoryBase() {  
  10.             this.context = new TestDBEntities();  
  11.         }  
  12.  
  13.         public IEnumerable<T> FindAll(Expression<Func<T, bool>> exp)  
  14.         {  
  15.             return context.Set<T>().Where(exp);  
  16.         }  
  17.  
  18.         public void Add(T entity)  
  19.         {  
  20.             context.Set<T>().Add(entity);  
  21.         }  
  22.  
  23.         public void Delete(T entity)  
  24.         {  
  25.             context.Set<T>().Remove(entity);  
  26.         }  
  27.  
  28.         public void Submit()  
  29.         {  
  30.             context.SaveChanges();  
  31.         }  
  32.     } 

這對(duì)于單一的某個(gè)倉儲(chǔ)我們單獨(dú)引入其自身的倉儲(chǔ)接口:

  1. public interface IUserRepository:IRepository<UserTest>  
  2. {  
  3.     IList<UserTest> GetAllById(int id);  
  4.  
  5.     bool CheckUserExist(UserTest u);  

特定倉儲(chǔ)實(shí)現(xiàn):

  1. public class UserRepository : RepositoryBase<UserTest>,IUserRepository  
  2.     {  
  3.         public IList<UserTest> GetAllById(int id)  
  4.         {  
  5.             using (TestDBEntities entities=new TestDBEntities())  
  6.             {  
  7.                 var users = from u in entities.UserTests  
  8.                             where u.ID == id  
  9.                             select u;  
  10.                 return users.ToList();  
  11.             }  
  12.         }  
  13.  
  14.         public bool CheckUserExist(UserTest u)  
  15.         {  
  16.             using (TestDBEntities entities = new TestDBEntities())  
  17.             {  
  18.                 List<UserTest> users = entities.UserTests.Where(ut => ut.UserName == u.UserName && ut.UserPassword==u.UserPassword).ToList<UserTest>();  
  19.                 return users.Count==0 ? false : true;  
  20.             }  
  21.         }  
  22.     } 

在Service層同樣建立相關(guān)接口適配特種服務(wù):

IUserCore:

  1. public interface IUserCore  
  2.     {  
  3.         CommandStatueEnum UserLogin(IModel model);  
  4.         CommandStatueEnum UserRegister(IModel model);  
  5.  
  6.         List<UserTest> GetUsers(Expression<Func<UserTest, bool>> expr);  
  7.     } 

UserCore:

  1. public class UserCore : IUserCore  
  2.     {  
  3.         #region Structure  
  4.         IUserRepository _repository;  
  5.         public UserCore(IUserRepository repository) {  
  6.             this._repository = repository;  
  7.         }  
  8.         #endregion  
  9.  
  10.         public CommandStatueEnum UserLogin(IModel model)  
  11.         {  
  12.             try 
  13.             {  
  14.                 UserLogin u = model as UserLogin;  
  15.                 UserTest uTest = new UserTest();  
  16.                 uTest.UserName = u.UserName;  
  17.                 uTest.UserPassword = u.Password;  
  18.  
  19.                 if (_repository.CheckUserExist(uTest))  
  20.                 {  
  21.                     return CommandStatueEnum.Succeed;  
  22.                 }  
  23.                 else 
  24.                 {  
  25.                     return CommandStatueEnum.Fail;  
  26.                 }  
  27.             }  
  28.             catch (Exception ex) {  
  29.                 throw ex;  
  30.             }  
  31.         }  
  32.  
  33.         public CommandStatueEnum UserRegister(IModel model)  
  34.         {  
  35.             try 
  36.             {  
  37.                 UserLogin u = model as UserLogin;  
  38.                 UserTest uTest = new UserTest() { UserName=u.UserName, UserPassword=u.Password};  
  39.                 _repository.Add(uTest);  
  40.                 _repository.Submit();  
  41.                 return CommandStatueEnum.Succeed;  
  42.             }  
  43.             catch (Exception ex)  
  44.             {  
  45.                 throw ex;  
  46.             }  
  47.         }  
  48.  
  49.  
  50.         public List<UserTest> GetUsers(System.Linq.Expressions.Expression<Func<UserTest, bool>> expr=null)  
  51.         {  
  52.            return _repository.FindAll(expr).ToList<UserTest>();  
  53.         }  
  54.     } 

Controller:

  1. public class AccountController : Controller  
  2.     {  
  3.         IUserCore userCore;  
  4.         public AccountController(IUserCore _userCore)  
  5.         {  
  6.             this.userCore = _userCore;  
  7.         }  
  8.  
  9.         //  
  10.         // GET: /Account/  
  11.  
  12.         #region view  
  13.         public ActionResult Home()  
  14.         {  
  15.             ViewBag.Users = userCore.GetUsers(u=>u.IsUse==1);  
  16.             return View();  
  17.         }  
  18.  
  19.         public ActionResult Login()  
  20.         {  
  21.             return View();  
  22.         }  
  23.  
  24.         public ActionResult Register()  
  25.         {  
  26.             return View();  
  27.         }  
  28.         #endregion  
  29.  
  30.         #region Post  
  31.         [HttpPost]  
  32.         public ActionResult Login(UserLogin account)  
  33.         {  
  34.             try 
  35.             {  
  36.                 if (userCore.UserLogin(account) == CommandStatueEnum.Succeed)  
  37.                 {  
  38.                     return RedirectToAction("Home");  
  39.                 }  
  40.                 else 
  41.                 {  
  42.                     return View();  
  43.                 }  
  44.             }  
  45.             catch (Exception ex)  
  46.             {  
  47.                 ExceptionModel.IsExcept = true;  
  48.                 ExceptionModel.Exception = ex.ToString();  
  49.                 ExceptionModel.CreateTime = DateTime.Now;  
  50.                 return View();  
  51.             }  
  52.         }  
  53.  
  54.         [HttpPost]  
  55.         public ActionResult Register(UserLogin account)  
  56.         {  
  57.             try 
  58.             {  
  59.                 if (userCore.UserRegister(account) == CommandStatueEnum.Succeed)  
  60.                 {  
  61.                     return RedirectToAction("Home");  
  62.                 }  
  63.                 else 
  64.                 {  
  65.                     return View();  
  66.                 }  
  67.             }  
  68.             catch (Exception ex)  
  69.             {  
  70.                 ExceptionModel.IsExcept = true;  
  71.                 ExceptionModel.Exception = ex.ToString();  
  72.                 ExceptionModel.CreateTime = DateTime.Now;  
  73.                 return View();  
  74.             }  
  75.         }  
  76.         #endregion  
  77.     } 

對(duì)于接口之間我們通過引入IOC工具解耦:

  1. public class MvcApplication : System.Web.HttpApplication  
  2.     {  
  3.         protected void Application_Start()  
  4.         {  
  5.             AreaRegistration.RegisterAllAreas();  
  6.  
  7.             WebApiConfig.Register(GlobalConfiguration.Configuration);  
  8.             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);  
  9.             RouteConfig.RegisterRoutes(RouteTable.Routes);  
  10.             BundleConfig.RegisterBundles(BundleTable.Bundles);  
  11.             AuthConfig.RegisterAuth();  
  12.  
  13.             #region IOC  
  14.             var builder = new ContainerBuilder();  
  15.             SetupResolveRules(builder);  
  16.             builder.RegisterControllers(Assembly.GetExecutingAssembly());  
  17.             var container = builder.Build();  
  18.             DependencyResolver.SetResolver(new AutofacDependencyResolver(container));  
  19.             #endregion  
  20.         }  
  21.  
  22.         private void SetupResolveRules(ContainerBuilder builder)  
  23.         {  
  24.             //Components are wired to services using the As() methods on ContainerBuilder  
  25.             builder.RegisterType<UserCore>().As<IUserCore>();  
  26.             builder.RegisterType<UserRepository>().As<IUserRepository>();  
  27.         }  
  28.  
  29.     } 

其他基礎(chǔ)類庫我們會(huì)結(jié)合具體需求進(jìn)行定制,上面例子多有不妥之處只起演示之用。

綜上所述,本篇只起拋磚引玉之用,還請(qǐng)大牛拍磚指導(dǎo)。

原文鏈接:http://www.cnblogs.com/xiguain/p/3636022.html

【編輯推薦】

  1. 從Script到Code Blocks、Code Behind到MVC、MVP、MVVM
  2. 5分鐘快速開發(fā)之代碼生成器asp.net mvc4
  3. 用Visual Studio 2013開始MVC5之旅
  4. 20款 JavaScript MVC 開源框架
  5. Spring MVC+JQuery+Google Map打造IP位置查找應(yīng)用
責(zé)任編輯:林師授 來源: 博客園
相關(guān)推薦

2015-09-23 14:17:01

Mvc多層架構(gòu)

2023-02-26 01:02:22

2024-02-07 08:52:07

VueUI 庫Vue.js

2021-03-18 08:04:54

AQS工具CAS

2014-07-08 09:27:24

SQLSERVER腳本

2023-01-03 12:30:25

架構(gòu)CPUGPU

2023-11-28 14:22:54

Python音頻

2020-03-06 18:43:58

Spring MVC控制器Java

2020-07-27 07:53:36

高并發(fā)流量系統(tǒng)

2018-11-16 17:00:05

Python腳本數(shù)據(jù)分析

2022-05-26 08:12:52

debugSpringFeign

2019-08-02 15:39:06

PythonLinuxJSON

2010-03-02 16:33:14

linux數(shù)據(jù)備份

2023-04-28 12:01:56

Spring項(xiàng)目編譯

2022-05-09 11:01:18

配置文件數(shù)據(jù)庫

2018-11-22 14:09:45

iOS架構(gòu)組件開發(fā)

2012-08-27 10:11:43

ASP.NET

2010-01-26 13:15:42

ASP.NET MVC

2011-06-02 10:23:33

程序員

2012-05-10 16:46:09

Visual Stud
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)