如何在模型创建期间覆盖ASP.NET MVC 3默认模型绑定器以解析依赖关系(使用ninject)?

Che*_*hev 7 c# asp.net-mvc dependency-injection model-binding asp.net-mvc-3

我有一个ASP.NET MVC 3应用程序,它使用Ninject来解决依赖关系.到目前为止,我必须做的就是使Global文件继承NinjectHttpApplication,然后重写CreateKernel方法以映射我的依赖项绑定.之后,我能够在我的MVC控制器构造函数中包含接口依赖项,并且ninject能够解析它们.一切都很棒.现在我想在模型绑定器中解决依赖关系,当它创建我的模型的实例时,但我不知道如何做到这一点.

我有一个视图模型:

public class CustomViewModel
{
    public CustomViewModel(IMyRepository myRepository)
    {
        this.MyRepository = myRepository;
    }

    public IMyRepository MyRepository { get; set; }

    public string SomeOtherProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个接受视图模型对象的action方法:

[HttpPost]
public ActionResult MyAction(CustomViewModel customViewModel)
{
    // Would like to have dependency resolved view model object here.
}
Run Code Online (Sandbox Code Playgroud)

如何覆盖默认模型绑定器以包含ninject并解决依赖关系?

Dar*_*rov 9

视图模型依赖于存储库是一种反模式.不要这样做.

如果你仍然坚持,这里有一个模型绑定器的样子的例子.我们的想法是使用自定义模型绑定器覆盖CreateModel方法:

public class CustomViewModelBinder : DefaultModelBinder
{
    private readonly IKernel _kernel;
    public CustomViewModelBinder(IKernel kernel)
    {
        _kernel = kernel;
    }

    protected override object CreateModel(ControllerContext controllerContext, 
      ModelBindingContext bindingContext, Type modelType)
    {
        return _kernel.Get(modelType);
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以注册任何你需要注入的视图模型:

ModelBinders.Binders.Add(typeof(CustomViewModel), 
  new CustomViewModelBinder(kernel));
Run Code Online (Sandbox Code Playgroud)

  • @Chevex,是的,问题在于具有存储库的视图模型.这意味着那些视图模型将从某个不是它们设计的地方提取数据.视图模型只是包含特定视图的格式化数据的传输对象.它们由控制器操作填充,该操作查询存储库或服务. (2认同)