首页 新闻 赞助 找找看

MVC 大中型项目如何分层?求各位大能指点.

1
悬赏园豆:100 [已解决问题] 解决于 2013-07-14 12:45

一大中型项目,预计访问量很大.一开始用三层架构模式,仅仅把UI层mvc化了.后来在网上看了很多文章,发现似乎mvc项目有自己的最适应的分层方式,但是看了很多文章,还是很迷糊.初次接触mvc,求大能们给个合理的分层,并简单说下各层的职责.

 

补充:我能理解asp.net mvc实际是表现层的mvc(我现在得做法就是这么做的,DAL+BLL+MVC).但是网站程序,基本用不到BLL层.看了网上的一些文章,发现mvc项目可能有专有(或是说独特或合适)的分层方法.其中还夹杂提到了一些新名词,如数据持久化/依赖注入等等.但是网上找到的文章都不全,都是介绍其中某一个小部分的,难以从全局角度理解整体项目框架.

 

希望各位大能能给个非三层、非简单的m-v-c三步走的分层示例,并简单那说明一下各层的职责和调用。感谢大家!

快乐鸟的主页 快乐鸟 | 初学一级 | 园豆:7
提问于:2012-04-20 02:04
< >
分享
最佳答案
0
收获园豆:100
dudu | 高人七级 |园豆:31075 | 2012-04-20 13:28

有没有好的办法把mvc中的m和额外的model层对应起来?不要每一次都去转化,这样太臃肿了。

快乐鸟 | 园豆:7 (初学一级) | 2012-04-21 23:15

@快乐鸟: 代码生成工具吧。

ChatinCode | 园豆:2272 (老鸟四级) | 2012-04-23 08:29
其他回答(4)
0

访问量很大,不表示逻辑结构很复杂,数据持久化/依赖注入是起码十多年历史的老名词了。如果BLL很简单,有两种情况,一种是逻辑确实很简单,另一种可能是采用了过程式设计,也就是说不够面向对象。层次数也没什么必须要怎样怎样的, 一切以你碰到的具体情况来定。

ChatinCode | 园豆:2272 (老鸟四级) | 2012-04-20 08:37
1

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动手术。

无之无 | 园豆:5095 (大侠五级) | 2012-04-20 08:49

你要确认:所谓的三层架构UI+BLL+DAL,这个是相对的。就像C/S架构一样,所谓Client不过是需求方,Server则只是服务方,在典型的三层架构中,任何一个模块能对其它模块提供数据服务,那就是DAL,而任何一个模块需要别的模块提供数据服务,那就是UI,而作为某一个模块,假如它既需要别的模块提供数据,也能对另外的模块提供数据,那就是BLL。

当然,当我们说UI层的时候,我们总喜欢当作是能用可视元素表现出来才模块,而DAL则总喜欢当作是一个数据库或者是对数据库简单封装的DLL(如LINQ)。

所以,当我们提到三层架构的时候,不要把思路过于局限在某一个层面,认定三层中的表示层一定是UI,数据层一定是数据库。

WebService其实也是一个数据层的形式存在于使用它的应用中,而一个WebService又是一个独立的项目,它的表示层此时便是它所输出的数据结构(数据的表现形式)。

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-04-20 08:56

@笨笨蜗牛: 你现在应用的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不是完全对应的),但是当他们完全一致时,这样的代码就显得臃肿了。

有没有好的办法解决这个问题?

支持(0) 反对(0) 快乐鸟 | 园豆:7 (初学一级) | 2012-04-20 09:59

@快乐鸟: 对这个问题,倒没有什么有效的解决方案。

我一般会采取以下方式:

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——

如果可能,采取继承的方式。

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-04-20 11:09

@笨笨蜗牛: 很多时候,我们在UI这个层次可能还有对数据进行进一步处理的需求,此时,则可以在Model里操作。

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-04-20 11:10

@笨笨蜗牛: 

方法1 的代码好像有问题。另外,其实这里把代码复杂化了,还不如我刚才实例的那样,直接去转化。

方法2和方法3哪里有介绍的?请简答说一下。

 

我总在想,有没有更好的办法避免这步?

支持(0) 反对(0) 快乐鸟 | 园豆:7 (初学一级) | 2012-04-20 13:58

@快乐鸟: 第二和第三不是很好的方案。我指的是根据某种需要或策略进行操作,要视具体情况。

至于更好的方法什么的,所有的一切都是有代价的,所谓得知桑榆失之东隅也就是这个道理。

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-04-20 15:46
0

BLL层是业务逻辑层,是拿来封装数据访问用的,这一点要理解!

类菌体 | 园豆:271 (菜鸟二级) | 2012-04-22 14:43
0

具体看示例吧,推荐dotnetage和果园项目都是MVC3的程序,你看看他们的架构是如何设计的。

lonely_rain | 园豆:752 (小虾三级) | 2012-04-23 09:16

ASP.NET MVC + Service + Repository 有基本示例吗?微软的看不懂

支持(0) 反对(0) 快乐鸟 | 园豆:7 (初学一级) | 2012-04-23 20:03

@快乐鸟: 如果上述两个项目你下载过,觉得有点难,你可以看DUDU给你推荐的。而且,在网上不可能找到符合你需求一模一样的项目,找个类似的,学习别人的设计思想,再针对自己的需求重新设计就行。还有就是dna和果园不是微软官方的项目。

支持(0) 反对(0) lonely_rain | 园豆:752 (小虾三级) | 2012-04-24 09:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册