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很友好地在评论中指出.因此,使用此解决方案需要您自担风险. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

