加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-web-api – 使用SimpleInjector有没有办法用.net 4 / we

发布时间:2020-12-16 09:54:09 所属栏目:asp.Net 来源:网络整理
导读:关注这个 question.我正在研究使用SimpleInjector和WebAPI的例子.不幸的是,我想利用WebAPI KB2568167和 KB2915689阻止我升级到.net 4.5.所以我坚持使用.net 4.0 WebAPI v1(4.0.30506.0)此刻. 有没有办法用旧版本的WebAPI复制RegisterWebApiRequest T()作用域
关注这个 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));

导致以下错误::

The registered delegate for type SimplePOCO threw an exception. The
SimplePOCO is registered as ‘Web API Request’ lifestyle,but the
instance is requested outside the context of a Web API Request.

我只是在配置中遗漏了什么?有替代方法 – 比如创建自己的消息处理程序吗?

UPDATE

在发布codeplex issue之后,我又回到了基础.我选择了一个普通的Mvc WebApi项目,引用了我的SimpleInjector,SimpleInjector.Integration.WebApi和SimpleInjector.Extensions.ExecutionContextScoping的编译.

就像@blueling一样,我能够在消息处理程序中使用它.

那有什么不同?我有一个想法是我的无功能项目是骨干 – 只有WebApi和纤薄的web.config.基础项目模板附带的脚手架和绒毛都不在我的解决方案中.明天我打算一次比较工作示例和非工作的一个引用引用和web.config设置.

更新2

所以多一点调试,确实在DependencyResolver实现上调用Dispose(),但不是我….

Call stack for 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很友好地在评论中指出.因此,使用此解决方案需要您自担风险.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读