ASP.. NET WebApi模型绑定与依赖注入

本文关键字:依赖 注入 绑定 模型 NET WebApi ASP | 更新日期: 2023-09-27 18:08:17

我有一个用ASP编写的web应用程序。带有Razor视图的。NET MVC 5。我有一组模型类,期望在构造函数中有一个ISomething,并且ISomething是使用Unity注入的。一切都很好。

我有这样的模型类:

public class SecurityRoleModel : PlainBaseModel
{
    #region Constructor
    /// <summary>
    /// Initializes a new instance of the <see cref="SecurityRoleModel"/> class.
    /// </summary>
    /// <param name="encryptionLambdas">The encryption lambdas.</param>
    public SecurityRoleModel(IEncryptionLambdas encryptionLambdas)
    {
    }
    #endregion
}

为了使注入正确工作,我必须实现一个自定义的DefaultModelBinder,它可以像这样处理模型构造器注入:

public class InjectableModelBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        if (modelType == typeof(PlainBaseModel) || modelType.IsSubclassOf(typeof(PlainBaseModel)))
            return DependencyResolver.Current.GetService(modelType);
        return base.CreateModel(controllerContext, bindingContext, modelType);
    }
}

再次,这是应用程序的MVC部分,但现在出现了丑陋的部分:我必须实现一组服务(WebAPI)处理这些模型,我认为我可以做一些类似于MVC的DefaultModelBinder在WebAPI,但似乎不像我想象的那么容易。

现在是我的问题-虽然我已经读了(我认为)很多关于自定义IModelBinder (WebAPI)实现的帖子,我不能说我找到了我要找的;我想要的是找到一种不重新发明轮子的方法(被读为"从头开始写IModelBinder"),我只是想有一个模型类实例化的地方,并有可能把我的代码从DI中获得模型类的实例。

我希望我说得够清楚了。提前谢谢你。

Evdin

ASP.. NET WebApi模型绑定与依赖注入

虽然不像MVC DefaultModelBinder那么广泛,它只涵盖了当序列化器/反序列化器是JSON时的情况。. NET,我为我的问题找到的解决方案如下:

a)从Newtonsoft.Json.Converters实现CustomCreationConverter<T>的自定义版本,如下所示:

public class JsonPlainBaseModelCustomConverter<T> : CustomCreationConverter<T>
{
    public override T Create(Type objectType)
    {
        return (T)DependencyResolver.Current.GetService(objectType);
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return null;
        return base.ReadJson(reader, objectType, existingValue, serializer);
    }
}

b)在WebApiConfig类中注册自定义转换器,Register方法如下:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new JsonPlainBaseModelCustomConverter<PlainBaseModel>());

虽然这可能不是最理想的情况,但它完全涵盖了我的问题。

如果有人知道更好的解决办法,请告诉我。

谢谢!