Asp.net mvc 正在删除ASP.NET MVC操作:应用程序控制器还是服务?

Asp.net mvc 正在删除ASP.NET MVC操作:应用程序控制器还是服务?,asp.net-mvc,asp.net-mvc-3,dry,service-layer,applicationcontroller,Asp.net Mvc,Asp.net Mvc 3,Dry,Service Layer,Applicationcontroller,我正在编写一个ASP.NET MVC 3应用程序,我发现自己在“动作方法”中经常写这句话: var user = _session.Single<User>(u => u.UserName == User.Identity.Name); var user=\u session.Single(u=>u.UserName==user.Identity.Name); (显然与属性结合使用) 还有其他一些事情经常重复,但这一个是最突出的,我最后有3个动作彼此相邻,每个动作都需要检索

我正在编写一个ASP.NET MVC 3应用程序,我发现自己在“动作方法”中经常写这句话:

var user = _session.Single<User>(u => u.UserName == User.Identity.Name);
var user=\u session.Single(u=>u.UserName==user.Identity.Name);
(显然与
属性
结合使用)

还有其他一些事情经常重复,但这一个是最突出的,我最后有3个动作彼此相邻,每个动作都需要检索授权用户

所以这需要干涸:

  • 我应该编写一个
    应用程序调用程序
    ,所有其他控制器都从中继承并公开
    用户
    属性,还是应该将其添加到我的
    IAdminService
    中,并将其作为一种方法公开

  • 在ASP.NET MVC中,应用程序控制器是应该避免的还是应该接受的


  • 作为一个不喜欢控制器超级类型的人,我会考虑使用依赖注入,并使用构造函数注入来“注入”用户。


    o/c这有一些缺点。这意味着您必须为控制器中的每次使用创建一个字段,还必须在IOC工具中创建一个绑定。这还假设您正在使用IOC容器

    关于其他选择:

    在IAdminService中公开它会给您带来额外的好处,使您可以在其他地方使用,而不仅仅是在控制器中。所以这是一个加号。只是要确保你的界面不会太混乱

    在基础控制器中使用它一开始也是很诱人的,但我发现随着越来越多的功能被添加,控制器基础类型变得臃肿和管理不善,因为没有多重继承,人们需要一些这样或那样的东西。。。事情会变得很糟糕。更不用说,如果使用AsyncController,您将有两种基本类型需要管理

    基本上,在你的两个选项之间,我会使用接口


    无论您做什么,您仍然可以向接口添加方法,并将其抽象到基本控制器中的用户属性后面

    如果您发现自己在重复此逻辑,则用户类型的自定义模型绑定器可能会有所帮助:

    public class UserModelBinder : DefaultModelBinder
    {
        private readonly ISession _session;
        public UserModelBinder(ISession session)
        {
            _session = session;
        }
    
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var username = controllerContext.HttpContext.User.Identity.Name;
            return _session.Single<User>(u => u.UserName == username);
        }
    }
    

    你考虑过一个吗?@Josiah-绝对不是:)当然不是为了这个小小的功能,那将是巨大的过度使用。此外,我有“标准”成员资格提供程序,并且运行顺利,我只会浪费时间。“o/c这有一些缺点。这意味着您必须为控制器中的每一个使用创建一个字段,并且还必须在您的IOC工具中创建一个绑定。这还假设您使用的是IOC容器。”-这根本不是真的。他可以简单地在一个基本控制器中创建任何他需要的类,而不需要DI。。。但你不觉得这有点俗气吗?我的意思是使用动作参数进行这样的使用?@Linkgoron,不,我个人不觉得这种方法有什么不妥。@Linkgoron-我也不认为它有什么不妥;实际上相当整洁。我看到的唯一两个“问题”是:1)它强制您每次都将用户作为参数传递,因此默认路由“{controller}/{action}/{id}”不再匹配。“{controller}/{action}/{user}/{id}”可能是个不错的选择。2) 它只对操作方法有用,在控制器中的其他任何地方都不有用,比如私有方法,而不会再次将其作为参数传递…@SergiPapaseit-您的参数无效。达林的密码不会影响路线。根据您的逻辑,接受模型的操作方法需要将模型构建到路由中,但事实并非如此。
    [Authorize]
    public ActionResult Foo(User user)
    {
        // ...
    }