新足迹

 找回密码
 注册

精华好帖回顾

· 2013遛弯拍照回顾(多图) (2014-1-5) zzoz · 柬埔寨暹粒金边 9日 从吴哥王朝到红色高棉 (更新完毕) (2017-6-13) monica612
· 短遊西澳~~ 浪漫的河邊小屋, 陰森的石群, 醉人的長堤~~ (2015-3-22) silvia · some interview questions (2005-4-7) astina
Advertisement
Advertisement
查看: 3185|回复: 43

对于MVC, 大家都同意 fat models, skinny controllers 吗? [复制链接]

发表于 2011-8-2 11:59 |显示全部楼层
此文章由 psaux 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 psaux 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果我要validate email address,放在model做好,还是放在controller做好?
Advertisement
Advertisement

发表于 2011-8-2 12:01 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
controller

特殊贡献奖章

发表于 2011-8-2 12:03 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这个话题有意思
acl是放在controller还是model呢?

发表于 2011-8-2 12:03 |显示全部楼层
此文章由 psaux 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 psaux 所有!转贴必须注明作者、出处和本声明,并保持内容完整
个人认为controller只负责调度不负责处理,所以我会放在model做,希望听到其他不同声音。

发表于 2011-8-2 12:09 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
http://www.asp.net/mvc/mvc3 主页上就有一个例子,详细地解释在
http://msdn.microsoft.com/en-us/library/gg508808%28VS.98%29.aspx


Remote Validator

ASP.NET MVC 3 supports the new RemoteAttribute class that enables you to take advantage of the jQuery Validation plug-in's remote validator support. This enables the client-side validation library to automatically call a custom method that you define on the server in order to perform validation logic that can only be done server-side.

In the following example, the Remote attribute specifies that client validation will call an action named UserNameAvailable on the UsersController class in order to validate the UserName field.

public class User
{
    [Remote("UserNameAvailable", "Users")]
    public string UserName { get; set; }
}

The following example shows the corresponding controller.

public class UsersController
{
    public bool UserNameAvailable(string username)
    {
        if(MyRepository.UserNameExists(username))
        {
            return "false";
        }
        return "true";
    }
}

发表于 2011-8-2 12:19 |显示全部楼层

回复 jerryclark 5# 帖子

此文章由 psaux 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 psaux 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你提供的信息只能说明asp.net mvc3是用controller来做email validation的。因为MS在mvc这快资质太浅,太嫩,我更希望听听来自open source方面意见。
Advertisement
Advertisement

特殊贡献奖章

发表于 2011-8-2 12:30 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你的口气好大,这里这么多.net的

我认为其实用在哪里不是一定的
mvc本来的意思是controller做business logic,所以基本上if..else都写在controller里,包括validation。
model就是简单的跟数据库的交流

但这样的话,系统就有一定的危险性,复杂的controller可能难以保证传给model的信息都是完美的。有很多人就把一些validation移到model里。但这样model就太麻烦,难以重用。当然,一些logic和data的读写可以分开用不同的model。

发表于 2011-8-2 12:36 |显示全部楼层

回复 kr2000 7# 帖子

此文章由 psaux 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 psaux 所有!转贴必须注明作者、出处和本声明,并保持内容完整
哈哈哈,不要想太多,交流而已,你随便拿微软的东西来当标准,那我只能实话实说了。
头像被屏蔽

禁止发言

发表于 2011-8-2 12:38 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
有建议是把validation尽可能的压到model里。
尽量使用attribute来设置validation.
返回错误用modelstate什么的。

发表于 2011-8-2 12:48 |显示全部楼层
此文章由 psaux 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 psaux 所有!转贴必须注明作者、出处和本声明,并保持内容完整
言归正传,个人认为可以把model再分层,在不同的model层中对data进行不同的处理,这样的好处是controller只需要知道model最上层的接口就行了,特别是针对企业级的应用,可以把开发力量都放在model上面,效率也高了。

发表于 2011-8-2 13:16 |显示全部楼层
此文章由 huazhb 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 huazhb 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我觉得MVC中的Controll更多的是类似UI Controller, 不是Business controller. Model那里可以分为BusinessModel和DataModel, DataModel就是纯Data, BusinessMode就是所有的Logic.  Contorller就和BusinessModel打交道. DataModel作为数据载体在整个系统中流动.
但是这样有个问题, 就是那些MVC提供的针对Model的很多特性都用不了. 当然你也可以在DataModel上设置那些Attribute. 只不过这样businesslogic就有一部分到DataModel上了
Advertisement
Advertisement

发表于 2011-8-2 13:58 |显示全部楼层

回复 huazhb 11# 帖子

此文章由 psaux 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 psaux 所有!转贴必须注明作者、出处和本声明,并保持内容完整
同意

发表于 2011-8-2 14:05 |显示全部楼层
此文章由 fyang1024 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fyang1024 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不了解DotNet, 在Java里,有些validation rule是跨model的,有些validation只是对model本身的
两种都试过,包括一些流行的MVC framework都提供两种方式,各有各的优点和局限

发表于 2011-8-2 14:13 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
取决于你怎么来定义model,如果只是data的表现形式,你要放在非model中.

如果model中允许logic,就可以用它放validation.

我个人倾向于放在controller中,因为它做unit test很方便。

如果用model放logic,要pass从controller constructor inject进来的abstraction到model level,但这也不是什么大事,就是有点不好看。

只是email address很简单,到不用这么兴师动众,在model那边加attribute就行,我是说普通的logic.

skinny controller的论点我不是很同意,主要是unit test的原因。

另外,logic也不应该进view的,如果在view中发现有if...else,也不是好的practice.

[ 本帖最后由 乱码 于 2011-8-2 13:20 编辑 ]

评分

参与人数 1积分 +5 收起 理由
kr2000 + 5 我很赞同

查看全部评分

发表于 2011-8-2 14:45 |显示全部楼层
此文章由 Limitless 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Limitless 所有!转贴必须注明作者、出处和本声明,并保持内容完整
controller
放在model里面工作量比放controller大

发表于 2011-8-2 14:57 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果只是关于email格式,在view里做就好了。
format不对,请不要来打搅server,请user先在client端解决再说。
Advertisement
Advertisement

发表于 2011-8-2 15:34 |显示全部楼层
此文章由 Limitless 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Limitless 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 于 2011-8-2 13:57 发表
如果只是关于email格式,在view里做就好了。
format不对,请不要来打搅server,请user先在client端解决再说。


这样的话经常会忘了在服务端再做一次过滤,很多网站都是因为只在客户端过滤导致安全问题……
头像被屏蔽

禁止访问

发表于 2011-8-2 16:04 |显示全部楼层
此文章由 atransformer 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 atransformer 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 于 2011-8-2 13:57 发表
如果只是关于email格式,在view里做就好了。
format不对,请不要来打搅server,请user先在client端解决再说。


client validation and server validation 缺一不可吧?

发表于 2011-8-2 16:09 |显示全部楼层
此文章由 huazhb 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 huazhb 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这个安全问题太大了....
原帖由 于 2011-8-2 13:57 发表
如果只是关于email格式,在view里做就好了。
format不对,请不要来打搅server,请user先在client端解决再说。

发表于 2011-8-2 16:25 |显示全部楼层
此文章由 伐木者 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 伐木者 所有!转贴必须注明作者、出处和本声明,并保持内容完整
model, can't reuse the logic much if it's in controller.

发表于 2011-8-2 17:30 |显示全部楼层

回复 乱码 14# 帖子

此文章由 psaux 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 psaux 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果把logic放在controller只是因为方便做unit test,这个理由太牵强了。
Advertisement
Advertisement

发表于 2011-8-2 17:30 |显示全部楼层

回复 Limitless 15# 帖子

此文章由 psaux 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 psaux 所有!转贴必须注明作者、出处和本声明,并保持内容完整
个人认为恰恰相反

发表于 2011-8-2 17:32 |显示全部楼层
此文章由 psaux 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 psaux 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 伐木者 于 2011-8-2 15:25 发表
model, can't reuse the logic much if it's in controller.

个人认为这个是正解,这也是mvc的精神之一,component reusable.

[ 本帖最后由 psaux 于 2011-8-2 16:37 编辑 ]

发表于 2011-8-2 18:12 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 psaux 于 2011-8-2 16:30 发表
如果把logic放在controller只是因为方便做unit test,这个理由太牵强了。


why?

除非你不unit test,怎么放都行。如果做,把logic集中在controller里面作unit test,比分散在model里面做方便多了。

我们的practice是,model分纯database的纯data(datamodel)和view相关的model(viewModel),中间有个mapping的过程,是logic.

dataprovider负责从database取datamodel,通过logic map到Viewmodel,然后把viewmodelpass到view作rendering.

任何viewmodel只是数据载体,没有任何的logic作附加。

如果把logic从controller单独分离出来做也是可以的,一样可以unit test和复用,但不要跟model混了行。

一家之言.

评分

参与人数 2积分 +6 收起 理由
jerryclark + 3 我很赞同
atransformer + 3 学习了

查看全部评分

头像被屏蔽

禁止访问

发表于 2011-8-2 18:19 |显示全部楼层

乱胸,如何 mapping datamodel和 viewModel??

此文章由 atransformer 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 atransformer 所有!转贴必须注明作者、出处和本声明,并保持内容完整

特殊贡献奖章

发表于 2011-8-2 18:20 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
同意

另外关于view里不能有logic的问题
我经常是传一块数据,一个object或数组到view里面,如果不能用loop的话,怎么样显示?
比如说一个帖子有100个回帖,都在一个数组里

原帖由 乱码 于 2011-8-2 13:13 发表
取决于你怎么来定义model,如果只是data的表现形式,你要放在非model中.

如果model中允许logic,就可以用它放validation.

我个人倾向于放在controller中,因为它做unit test很方便。

如果用model放logic,要pass从controlle ...
Advertisement
Advertisement

发表于 2011-8-2 18:26 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 atransformer 于 2011-8-2 17:19 发表


@transformer

DataModel map到 viewmodel就是logic,需要unit test的。

我们的presenter做这个事,而且mvp的handlerfactory允许abstraction contractor injection.

mvc中同样可以做这个事,而且在3中简单很多,controller类似于mvp中的presenter.

发表于 2011-8-2 18:31 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 kr2000 于 2011-8-2 17:20 发表
同意

另外关于view里不能有logic的问题
我经常是传一块数据,一个object或数组到view里面,如果不能用loop的话,怎么样显示?
比如说一个帖子有100个回帖,都在一个数组里



怎么也要loop的,不过不能加Branching Statements如if else,所有的判断都要去能unit test的地方.

view只是用loop来render whaterver in there,而不关心真正是什么数据.

如果真的要branching,说明细分的还不够,或者违法了single responsibility的原则。

评分

参与人数 3积分 +14 收起 理由
o2h2o + 5 感谢分享
飘逸的羽翼 + 4 学习了
kr2000 + 5 感谢分享

查看全部评分

发表于 2011-8-2 19:03 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果把一些公用的函数放在一个类中,不是model/controler/view的地方,就是一个普通的类
比如做一个公用的类
class austeps{
public static void send_email(xxxxx){
}

public static void calculate_something(xxxx){
}
}


请问这样做有什么问题不?

发表于 2011-8-2 19:12 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 于 2011-8-2 18:03 发表
如果把一些公用的函数放在一个类中,不是model/controler/view的地方,就是一个普通的类
比如做一个公用的类
class austeps{
public static void send_email(xxxxx){
}

public static void calculate_something(xxxx){
}
}



请问这样做有什么问题不?


这样有问题,static的class几乎所有市面上的mocking framework都不能作test,如果用不是free的那几个,就还行。

不过static的现在很多人也不提倡用,即使是utility class,而不跟state相关的,大家也比较避讳,我也不知道为什么。

我个人没这么极端,觉得除了不能test,其他的都ok.

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部