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
虽然不像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>());
虽然这可能不是最理想的情况,但它完全涵盖了我的问题。
如果有人知道更好的解决办法,请告诉我。
谢谢!