【问题标题】:How to override the ASP.NET MVC 3 default model binder to resolve dependencies (using ninject) during model creation?如何在模型创建期间覆盖 ASP.NET MVC 3 默认模型绑定器以解决依赖关系(使用 ninject)?
【发布时间】:2011-09-23 05:31:46
【问题描述】:

我有一个使用 Ninject 解决依赖关系的 ASP.NET MVC 3 应用程序。到目前为止,我所要做的就是让全局文件从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 和解析依赖项?

【问题讨论】:

  • 我不知道你的问题的答案,但我认为你的视图模型不应该有依赖关系。这看起来像活动记录模式,听起来很干净,但实际上很难维护。你的控制器可以有依赖关系,比如服务或其他东西。您的控制器将调用 customViewModel.Save() 或 this.myServiceDep.Save(customViewModel)。后者会更好。
  • 您可能是正确的,但我仍然对答案感兴趣。我想知道如何覆盖默认模型绑定器来执行这样的任务,即使我没有在生产中使用它。

标签: c# asp.net-mvc asp.net-mvc-3 dependency-injection model-binding


【解决方案1】:

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

如果您仍然坚持,here's an example 模型活页夹的外观。这个想法是有一个自定义模型绑定器,您可以在其中覆盖 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));

【讨论】:

  • 我意识到这不是一个好的做法,但你能解释一下为什么会这样吗?让视图模型依赖于存储库只是不好的做法,还是问题更广泛,因为让视图模型具有任何依赖关系是不好的做法?
  • @Chevex,是的,问题在于视图模型具有存储库。这意味着这些视图模型将从某个不是它们设计用途的地方提取数据。视图模型只是包含特定视图的格式化数据的传输对象。它们由查询存储库或服务的控制器操作填充。
  • 好的,我明白了。说实话,这是一个针对这个问题的即兴例子。那么,一般来说,拥有一个具有依赖关系的视图模型就可以了吗?
  • @Chevex,不,视图模型不应该有依赖关系。简单的 POCO。你可以用格式化和验证属性来装饰它们,但不要给它们依赖。
  • 哦,好吧,这里有两个问题。一个是我的视图模型不应该访问数据源,另一个是我的视图模型根本不应该依赖于其他服务/组件。说得通。谢谢你的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多