Ric*_*ard 8 autofac fluentvalidation asp.net-web-api
在MVC中,ModelValidatorProvider
实例化并调用a以在每个请求上验证模型.这意味着在DI环境中,它可以依赖于单个请求中作用域的对象,例如工作单元或数据库上下文.在Web API中,这似乎已经发生了重大变化.而不是按请求实例化,ModelValidatorProvider
似乎是在应用程序启动期间长期存在并实例化的.然后,WebAPI缓存来自ModelValidatorProvider
per类型的结果,这意味着ModelValidator
不能从DI中获取任何依赖性.
我正在尝试ModelValidator
使用服务定位器实现我使用工厂(请不要自动'反模式'注释!).这将允许我在每个请求中构造一个内部验证器对象,它可以从容器中获取依赖关系.但是,我无法获得一个依赖性解析器或容器作为当前请求的范围,该请求ModelValidator
主要是作为Singleton的范围.我试过使用GlobalConfiguration.Configuration.DependencyResolver
,但这只返回全局范围的服务(从根范围,这里也提到)
我在Autofac工作,因此特定于autofac的解决方案是合适的(例如MVC具有AutofacDependencyResolver.Current
,内部使用DependencyResolver.GetService
).WebAPI集成中没有可用的等价物,可能是因为上面提到的全局DependencyResolver
仅返回全局范围服务的原因.
我尝试这样做(以及我自己使用)的原因是为FluentValidation实现Web API集成,目前不存在.到目前为止已经进行了两次尝试,但这些尝试都没有处理依赖注入问题,而是导致单个静态ModelValidator.
到目前为止我尝试过的事情:
GlobalConfiguration.Configuration.DependencyResolver
(返回根作用域中的对象)Func<IComponentContext>
(总是返回根上下文)在已删除的答案中,建议IModelValidatorProvider
从Web API配置中删除服务.这必须使用反射来完成,因为接口和实现类都被定义为内部,但它确实使验证器更好地工作(因为ModelValidator是按请求构造的).但是,由于使用反射来检查模型上的验证器及其具有的每个属性,因此以这种方式执行它会有显着的性能损失,因此我不想采用此选项.
Filip W的回答建议使用HttpRequestMessage获取依赖范围,但是我没有找到任何HttpRequestMessage.Current
可以在长期存在的对象中提供对该对象的访问的东西- 如果可以实现,我相信一切都会落到实处.
要获取当前依赖范围,您必须使用GetDependencyScope()
当前的(惊讶,惊讶:)(更多信息,您可以在 MSDN 上HttpRequestMessage
阅读)而不是GlobalConfiguration
.
我不久前在博客中写了有关Web API 每个请求依赖范围的文章- 这应该会有所帮助。
归档时间: |
|
查看次数: |
6444 次 |
最近记录: |