【问题标题】:Inject Dependency during model binding microsoft web api在模型绑定 microsoft web api 期间注入依赖项
【发布时间】:2016-07-20 02:00:38
【问题描述】:

在我的 MVC 项目中,我有一个自定义默认模型绑定器,它在模型绑定器创建模型时使用依赖解析器将服务注入模型。因此,我可以在模型中使用会员服务或可查询会话来进行验证,而将其排除在控制器之外。

    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        if (modelType.IsGenericType)
            return base.CreateModel(controllerContext, bindingContext, modelType);

        return _dependencyResolver.GetService(modelType);
    }`

我想知道是否有办法在 Microsoft Web API 中执行此操作? IModelBinder 不提供要覆盖的 CreateModel 方法,并且经过搜索,我看不到任何方法可以做到这一点。

【问题讨论】:

  • 所以你想正确地将服务注入你的 ModelBinder 实例(也许我没看错)?您是否尝试过在 ModelBinder 的构造函数中使用注入?它还可能取决于您使用的注入框架,有些比其他的更受限制。
  • 当模型绑定器创建模型时,我想注入任何需要的服务。假设我有 UpdateUserModel(ISession session)。我希望模型绑定器注入它,以便我可以在 UpdateUserModel.Validate() 中查询会话。使用ninject作为框架
  • 我只是做了一些搜索,但在创建模型时我也找不到方法。

标签: c# asp.net-web-api dependency-injection asp.net-web-api2 model-binding


【解决方案1】:

Bonno,只要您使用特定的模型类型,WebAPI 就会自动解析或尝试解析控制器中的模型。检查Parameter Binding in ASP.NET Web API.

默认情况下,Web API 使用以下规则绑定参数:

如果参数是“简单”类型,Web API 会尝试获取该值 从 URI。简单类型包括 .NET 原始类型(int、 bool、double 等),以及 TimeSpan、DateTime、Guid、decimal、 和字符串,加上任何带有类型转换器的类型,可以从 一个字符串。 (稍后将详细介绍类型转换器。)对于复杂类型,Web API 尝试使用媒体类型从消息正文中读取值 格式化程序。

例如:

[Route("api/myApi")]
 public HttpStatusCode Post(SomeModelType modelObject)
{ ... }

如果发布的 json 对象可以解析为 SomeModelType ,则 SomeModelType 的实例以 modelObject 的形式创建。

关键是您不需要自己的依赖解析器。但是,如果您出于某种原因仍想拥有一个,则 JToken 参数类型将是任何和所有对象。您有责任以与 MVC 类似的方式反序列化和处理对象。

编辑


阅读您的 cmets 后,我意识到您在谈论依赖注入。由于 WebAPI 在解析参数方面的工作方式,我不建议将依赖项注入到您的控制器函数中,而是让您的控制器实例化一个类,在该类中通过构造函数或其他方式注入依赖项,并将其留给您的依赖项容器/注入器完成这项工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2017-01-31
    • 2014-07-26
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多