Asp.net mvc 正在删除ASP.NET MVC操作:应用程序控制器还是服务?
我正在编写一个ASP.NET MVC 3应用程序,我发现自己在“动作方法”中经常写这句话: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个动作彼此相邻,每个动作都需要检索
var user = _session.Single<User>(u => u.UserName == User.Identity.Name);
var user=\u session.Single(u=>u.UserName==user.Identity.Name);
(显然与属性
结合使用)
还有其他一些事情经常重复,但这一个是最突出的,我最后有3个动作彼此相邻,每个动作都需要检索授权用户
所以这需要干涸:
应用程序调用程序
,所有其他控制器都从中继承并公开用户
属性,还是应该将其添加到我的IAdminService
中,并将其作为一种方法公开作为一个不喜欢控制器超级类型的人,我会考虑使用依赖注入,并使用构造函数注入来“注入”用户。
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)
{
// ...
}