在我的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方法来覆盖,并且在搜索之后,我看不到任何方法来执行此操作。
答案 0 :(得分:0)
Bonno,只要您使用特定的模型类型,WebAPI就会自动解析或尝试在控制器中解析模型。查看Parameter Binding in ASP.NET Web API.
默认情况下,Web API使用以下规则绑定参数:
如果参数是“简单”类型,Web API会尝试获取该值 来自URI。简单类型包括.NET基元类型(int, bool,double等等,加上TimeSpan,DateTime,Guid,decimal, 和字符串,以及具有可转换的类型转换器的任何类型 一个字符串。 (稍后将详细介绍类型转换器。)对于复杂类型,Web API尝试使用媒体类型从邮件正文中读取值 格式化。
例如:
1.Store 123 has cloth style B.
2.Store 253 has cloth style D.
3.Store 27 has cloth style A.
4.Store 164 has cloth style F.
......
如果发布的json对象可以解析为SomeModelType,则以modelObject的形式创建SomeModelType的实例。
重点是你不需要自己的依赖解析器。但是,如果您仍然想要出于某种原因,JToken参数类型将包含任何和所有对象。您有责任以与MVC类似的方式反序列化和处理对象。
修改强>
阅读完评论后,我意识到你在谈论依赖注入。由于WebAPI在解析参数方面的工作方式,我不建议将依赖项注入到控制器函数中,而是让控制器实例化一个通过构造函数或其他方式注入依赖项的类,并将其保留到依赖容器/注入器中。做那个工作。