Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在模型创建期间覆盖ASP.NET MVC 3默认模型绑定器以解决依赖关系(使用ninject)?_C#_Asp.net Mvc_Asp.net Mvc 3_Dependency Injection_Model Binding - Fatal编程技术网

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

C# 如何在模型创建期间覆盖ASP.NET MVC 3默认模型绑定器以解决依赖关系(使用ninject)?,c#,asp.net-mvc,asp.net-mvc-3,dependency-injection,model-binding,C#,Asp.net Mvc,Asp.net Mvc 3,Dependency Injection,Model Binding,我有一个ASP.NET MVC 3应用程序,它使用Ninject解决依赖关系。到目前为止,我所要做的就是让全局文件从NinjectHttpApplication继承,然后重写CreateKernel方法来映射依赖项绑定。之后,我可以在我的MVC控制器构造函数中包含接口依赖项,ninject可以解决它们。这一切都很好。现在,我想在创建模型实例时解决模型绑定器中的依赖关系,但我不知道如何做到这一点 我有一个视图模型: public class CustomViewModel { public

我有一个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并解析依赖关系?

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

如果你仍然坚持的话,你会看到一个活页夹的样子。其想法是使用自定义模型绑定器,在其中覆盖
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));

我不知道您的问题的答案,但我的意见是您的视图模型不应该具有依赖性。这看起来像是活动记录模式,听起来很好,很干净,但最终很难维护。您的控制器可以有依赖项,比如服务或其他东西。您的控制器将调用customViewModel.Save()或this.myServiceDep.Save(customViewModel)。后者会更好。你可能是对的,但我仍然对答案感兴趣。我想知道如何覆盖默认的模型绑定器来执行这样的任务,即使我没有在生产中使用它。我意识到这不是一个好的做法,但是你能解释一下为什么会这样吗?让视图模型依赖于存储库是唯一一种不好的做法,还是问题更广泛,因为让视图模型具有任何依赖关系都是不好的做法?@Chevex,是的,问题在于视图模型具有存储库。这意味着这些视图模型将从并非其设计目的的地方提取数据。视图模型只是包含特定视图的格式化数据的传输对象。它们由查询存储库或服务的控制器操作填充。说实话,这是一个针对这个问题的现成例子。所以,一般来说,拥有一个具有依赖关系的视图模型是可以的?@Chevex,不,视图模型不应该具有依赖关系。简单的POCO。你可以用格式化和验证属性来装饰它们,但不要给它们依赖关系。一个是我的视图模型不应该访问数据源,另一个是我的视图模型不应该真正依赖于其他服务/组件。有道理。谢谢你提供的信息。