一大中型项目,预计访问量很大.一开始用三层架构模式,仅仅把UI层mvc化了.后来在网上看了很多文章,发现似乎mvc项目有自己的最适应的分层方式,但是看了很多文章,还是很迷糊.初次接触mvc,求大能们给个合理的分层,并简单说下各层的职责.
补充:我能理解asp.net mvc实际是表现层的mvc(我现在得做法就是这么做的,DAL+BLL+MVC).但是网站程序,基本用不到BLL层.看了网上的一些文章,发现mvc项目可能有专有(或是说独特或合适)的分层方法.其中还夹杂提到了一些新名词,如数据持久化/依赖注入等等.但是网上找到的文章都不全,都是介绍其中某一个小部分的,难以从全局角度理解整体项目框架.
希望各位大能能给个非三层、非简单的m-v-c三步走的分层示例,并简单那说明一下各层的职责和调用。感谢大家!
推荐一个示例程序:
有没有好的办法把mvc中的m和额外的model层对应起来?不要每一次都去转化,这样太臃肿了。
@快乐鸟: 代码生成工具吧。
访问量很大,不表示逻辑结构很复杂,数据持久化/依赖注入是起码十多年历史的老名词了。如果BLL很简单,有两种情况,一种是逻辑确实很简单,另一种可能是采用了过程式设计,也就是说不够面向对象。层次数也没什么必须要怎样怎样的, 一切以你碰到的具体情况来定。
MVC确实是UI层的独立三层架构,但也仅仅局限于UI层。在MVC中,MODEL作为数据层的形式存在,并不代表这个MODEL就是一个简单的MODEL了。
你可以把MVC里的MODEL当作一个数据代理层的形式存在,或者说是典型三层架构中的UI层存在。
你的架构定义DAL+BLL+MVC也是我在实际开发中使用的。在MVC中,MODEL的存在只是为了UI曾的View提供数据模型,避免View在使用数据的时候收到DAL或BLL层的限制,从而使得View设计人员不需要太多的去了解BLL与DAL,并且也使得数据层、DLL层与UI层的耦合度大大的降低。当我们把UI层设计好了后,如果DAL或BLL有业务、逻辑或数据方面的结构调整,只需要调整UI层的MODEL,而不需要去动View,同样的,当我们需要对UI进行调整的时候,也只需要修改CONTROLLER、VIEW或MODEL就好,而不需要去对BLL或DAL动手术。
你要确认:所谓的三层架构UI+BLL+DAL,这个是相对的。就像C/S架构一样,所谓Client不过是需求方,Server则只是服务方,在典型的三层架构中,任何一个模块能对其它模块提供数据服务,那就是DAL,而任何一个模块需要别的模块提供数据服务,那就是UI,而作为某一个模块,假如它既需要别的模块提供数据,也能对另外的模块提供数据,那就是BLL。
当然,当我们说UI层的时候,我们总喜欢当作是能用可视元素表现出来才模块,而DAL则总喜欢当作是一个数据库或者是对数据库简单封装的DLL(如LINQ)。
所以,当我们提到三层架构的时候,不要把思路过于局限在某一个层面,认定三层中的表示层一定是UI,数据层一定是数据库。
WebService其实也是一个数据层的形式存在于使用它的应用中,而一个WebService又是一个独立的项目,它的表示层此时便是它所输出的数据结构(数据的表现形式)。
@笨笨蜗牛: 你现在应用的dal+bll+mvc中,三个层之间是如何传递数据的。是不是有一个额外的model层,并且这个层和数据库是对应的(codefirst中的model),这样的话,有一处地方的代码比较臃肿。当mvc的m和model层字段一样时,需要进行一次转化。
例如:
SchoolContext db = new SchoolContext(); var item=db.Students.ToList();//数据库数据列表 var list=new List<Student>();//此处的Student为mvc中的m foreach( var q in item) { Models.Student model=new Models.Student(); model.ID=q.ID; model.Name=q.Name; list.add(model) } return View((list);
在如上代码示意中,当mvc的m和model不一致时还好说。(有些时候页面model和数据model不是完全对应的),但是当他们完全一致时,这样的代码就显得臃肿了。
有没有好的办法解决这个问题?
@快乐鸟: 对这个问题,倒没有什么有效的解决方案。
我一般会采取以下方式:
1——
重复的对属性进行调用:
如:
public class WebModel { private BizModel _model; private BizModel Model { get { if(_model == null) { //create biz model } return _model; } } public object MyProperty { get { return Model.MyProperty; } set { } } }
2——
使用反射的形式
3——
使用Dictionary或dynamic
4——
如果可能,采取继承的方式。
@笨笨蜗牛: 很多时候,我们在UI这个层次可能还有对数据进行进一步处理的需求,此时,则可以在Model里操作。
@笨笨蜗牛:
方法1 的代码好像有问题。另外,其实这里把代码复杂化了,还不如我刚才实例的那样,直接去转化。
方法2和方法3哪里有介绍的?请简答说一下。
我总在想,有没有更好的办法避免这步?
@快乐鸟: 第二和第三不是很好的方案。我指的是根据某种需要或策略进行操作,要视具体情况。
至于更好的方法什么的,所有的一切都是有代价的,所谓得知桑榆失之东隅也就是这个道理。
BLL层是业务逻辑层,是拿来封装数据访问用的,这一点要理解!
具体看示例吧,推荐dotnetage和果园项目都是MVC3的程序,你看看他们的架构是如何设计的。
ASP.NET MVC + Service + Repository 有基本示例吗?微软的看不懂
@快乐鸟: 如果上述两个项目你下载过,觉得有点难,你可以看DUDU给你推荐的。而且,在网上不可能找到符合你需求一模一样的项目,找个类似的,学习别人的设计思想,再针对自己的需求重新设计就行。还有就是dna和果园不是微软官方的项目。