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