Fan*_*rns 4 c# design-patterns ninject asp.net-mvc-3
我有一个ASP.NET MVC 3应用程序,并使用Ninject将依赖项注入我的类.
控制器上的操作将ViewModel(不包含逻辑)传递给视图层.
当HTTP表单被POST时,MVC 3创建一个ViewModel实例并将传入的POST数据绑定到ViewModel的属性.MVC 3使用名为DefaultModelBinder的类来创建实例并执行绑定.
我的大多数ViewModel都共享一个依赖项,我并不想从每个单独的Controller方法(DRY原则)中设置它.
因此,我创建了一个DefaultModelBinder的自定义子类,如下所示:
using System;
using System.Web.Mvc;
namespace Application.Classes {
public sealed class CustomModelBinder : DefaultModelBinder {
private readonly IDependencyResolver DependencyResolver;
public CustomModelBinder( IDependencyResolver dependencyResolver ) {
DependencyResolver = dependencyResolver;
}
protected override object CreateModel( ControllerContext controllerContext , ModelBindingContext modelBindingContext , Type modelType ) {
return DependencyResolver.GetService( modelType );
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已将其设置为替换DefaultModelBinder,如下所示(在Global.asax.cs中):
protected void Application_Start() {
// ...
ModelBinders.Binders.DefaultBinder = new CustomModelBinder( DependencyResolver.Current );
// ...
}
Run Code Online (Sandbox Code Playgroud)
通过在Controller方法接收ViewModel时执行此操作,它将是由Ninject使用我在NinjectModule中指定的绑定构建的.ViewModel现在接收注入其构造函数的依赖项.
这是否适合使用服务定位器模式?
澄清/更新:
据我所知,到目前为止,您有一个ViewModel,它继承自ViewModelBase,以在用户登录的所有视图上公开AccountInformation.
除非我完全误解,否则这是我的观点:
AccountInformation只应用于显示目的.因此,当默认的ModelBinder在您的操作的帖子发生时不实例化它应该不是问题.我鼓励您使用您拥有的信息再次获取AccountInformation.Controller.User和你的数据库.注册/个人资料页面是您希望此信息来自POST变量的唯一位置.如有必要,您可以按用户缓存此信息.
正如我在评论中所说,ViewModels应该尽可能愚蠢.它们应该只包含属性及其类型和元数据有关验证等.
您想要放入视图中的所有逻辑都会进入控制器.
总结一下; 不应该在ModelBinder中使用服务定位器.
| 归档时间: |
|
| 查看次数: |
452 次 |
| 最近记录: |