这是否适合使用我的MVC 3 ModelBinder中的服务定位器模式?

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现在接收注入其构造函数的依赖项.

这是否适合使用服务定位器模式?

澄清/更新:

Pet*_*ter 5

据我所知,到目前为止,您有一个ViewModel,它继承自ViewModelBase,以在用户登录的所有视图上公开AccountInformation.

除非我完全误解,否则这是我的观点:
AccountInformation只应用于显示目的.因此,当默认的ModelBinder在您的操作的帖子发生时不实例化它应该不是问题.我鼓励您使用您拥有的信息再次获取AccountInformation.Controller.User和你的数据库.注册/个人资料页面是您希望此信息来自POST变量的唯一位置.如有必要,您可以按用户缓存此信息.

正如我在评论中所说,ViewModels应该尽可能愚蠢.它们应该只包含属性及其类型和元数据有关验证等.

您想要放入视图中的所有逻辑都会进入控制器.

总结一下; 不应该在ModelBinder中使用服务定位器.