如何在模型创建过程中重写ASP.NET MVC 3默认模型绑定器以解析依赖关系(使用ninject)

本文关键字:模型 依赖 ninject 使用 绑定 关系 默认 过程中 创建 重写 ASP | 更新日期: 2023-09-27 18:00:22

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

我有一个视图模型:

public class CustomViewModel
{
    public CustomViewModel(IMyRepository myRepository)
    {
        this.MyRepository = myRepository;
    }
    public IMyRepository MyRepository { get; set; }
    public string SomeOtherProperty { get; set; }
}

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

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

如何覆盖默认的模型绑定器以包含ninject并解析依赖项?

如何在模型创建过程中重写ASP.NET MVC 3默认模型绑定器以解析依赖关系(使用ninject)

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

如果你仍然坚持,这里有一个模型活页夹的样子的例子。这个想法是有一个自定义的模型绑定器,您可以在其中覆盖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);
    }
}

您可以为任何需要进行此注入的视图模型注册:

ModelBinders.Binders.Add(typeof(CustomViewModel), 
  new CustomViewModelBinder(kernel));