使用依赖注入的ASP.NET WebApi模型绑定

时间:2016-09-22 19:15:32

标签: c# asp.net-mvc asp.net-web-api asp.net-mvc-5 unity-container

我有一个用ASP.NET MVC 5编写的Web应用程序,它具有完美的Razor视图。我有一组模型类,它们在构造函数中需要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& #39;在WebAPI中DefaultModelBinder,但似乎并不像我想象的那么容易。

现在我的问题出现了 - 虽然我已经阅读了很多关于自定义IModelBinder(WebAPI)实施的帖子,但我不能说我找到了我正在寻找的内容对于;我想要的是找到一种不重新发明轮子的方法(读作&#34;从头开始写IModelBinder),我只想有一个模型类被实例化的地方,并且有可能把我的代码从DI中获取模型类的实例。

我希望我足够清楚。提前谢谢。

Evdin

1 个答案:

答案 0 :(得分:0)

虽然没有MVC DefaultModelBinder那么广泛,它只涵盖了序列化程序/反序列化程序是JSON.NET的情况,但我找到的问题解决方案如下:

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

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>());

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

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

谢谢!