asp.net-web-api – 使用SimpleInjector有没有办法用.net 4 / we
关注这个
question.我正在研究使用SimpleInjector和WebAPI的例子.不幸的是,我想利用WebAPI
KB2568167和
KB2915689阻止我升级到.net 4.5.所以我坚持使用.net 4.0& WebAPI v1(4.0.30506.0)此刻.
有没有办法用旧版本的WebAPI复制RegisterWebApiRequest< T>()作用域? 虽然我的nu-get软件包只包含.net 4.5版本,但我能够下载代码并获得框架4.0编译而没有太多麻烦.在我的Message Handler中调用var container = request.GetDependencyScope()时,将返回一个SimpleInjectorWebApiDependencyResolver类.试图从容器中检索实例,如下所示: var poco = (SimplePOCO) container.GetService(typeof(SimplePOCO)); 导致以下错误::
我只是在配置中遗漏了什么?有替代方法 – 比如创建自己的消息处理程序吗? UPDATE 在发布codeplex issue之后,我又回到了基础.我选择了一个普通的Mvc WebApi项目,引用了我的SimpleInjector,SimpleInjector.Integration.WebApi和SimpleInjector.Extensions.ExecutionContextScoping的编译. 就像@blueling一样,我能够在消息处理程序中使用它. 那有什么不同?我有一个想法是我的无功能项目是骨干 – 只有WebApi和纤薄的web.config.基础项目模板附带的脚手架和绒毛都不在我的解决方案中.明天我打算一次比较工作示例和非工作的一个引用引用和web.config设置. 更新2 所以多一点调试,确实在DependencyResolver实现上调用Dispose(),但不是我…. 解决方法
我能够解决这个问题.我不完全清楚为什么在SimpleInjectorWebApiDependencyResolver上调用dispose,但这是我想到的:
BAD依赖关系解析器实现是one listed here的副本: public sealed class SimpleInjectorWebApiDependencyResolver : IDependencyResolver { private readonly Container container; public SimpleInjectorWebApiDependencyResolver(Container container) { this.container = container; } public IDependencyScope BeginScope() { return this; } public object GetService(Type serviceType) { return ((IServiceProvider)this.container).GetService(serviceType); } public IEnumerable<object> GetServices(Type serviceType) { return this.container.GetAllInstances(serviceType); } public void Dispose() { } } 我注意到我在here下载的源代码中有一些不同的副本. public sealed class SimpleInjectorWebApiDependencyResolver : IDependencyResolver { private readonly Container container; private readonly Scope scope; public SimpleInjectorWebApiDependencyResolver(Container container) : this(container,beginScope: false) { Requires.IsNotNull(container,"container"); } private SimpleInjectorWebApiDependencyResolver(Container container,bool beginScope) { this.container = container; if (beginScope) { this.scope = container.BeginExecutionContextScope(); } } IDependencyScope IDependencyResolver.BeginScope() { return new SimpleInjectorWebApiDependencyResolver(this.container,beginScope: true); } object IDependencyScope.GetService(Type serviceType) { if (!serviceType.IsAbstract && typeof(IHttpController).IsAssignableFrom(serviceType)) { return this.container.GetInstance(serviceType); } return ((IServiceProvider)this.container).GetService(serviceType); } IEnumerable<object> IDependencyScope.GetServices(Type serviceType) { return this.container.GetAllInstances(serviceType); } void IDisposable.Dispose() { if (this.scope != null) { this.scope.Dispose(); } } } 切换到这个版本后一切正常.我仍然有潜在的问题CallContext.LogicalGetData和嵌套执行上下文,因为@Steven很友好地在评论中指出.因此,使用此解决方案需要您自担风险. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |