SignalR 中心中每个 web-api 请求的简单注入器依赖项

2023-11-22

根据this发布后,应该可以将每个网络请求的依赖项注入 SignalR 集线器(尽管有一些限制,例如 OnDisconnected() 方法的问题)。就我而言,它是 ASP Web API(不是 MVC),但由于某种原因它不起作用。

以下是相关部分:

container.RegisterWebApiControllers(httpConfiguration);

container.RegisterWebApiRequest<DbContext, MyDbContext>();
container.RegisterWebApiRequest<ISampleRepository, SampleRepository>(); //DbContext injected to SampleRepository


//Enable injections to SignalR Hubs
var activator = new SimpleInjectorHubActivator(container);
GlobalHost.DependencyResolver.Register(typeof(IHubActivator), () => activator);

这个类可以注入集线器:

public class SimpleInjectorHubActivator : IHubActivator
        {
            private readonly Container _container;

            public SimpleInjectorHubActivator(Container container)
            {
                _container = container;
            }

            public IHub Create(HubDescriptor descriptor)
            {
                return (IHub)_container.GetInstance(descriptor.HubType);
            }
}

和集线器本身:

 [HubName("sample")]
 public class SampleHub : Hub
    {

        public ActiveBetsHub(ISampleRepository repository)
        {
        }

        //Irrelevant methods here. OnDisconnected() NOT implemented!
    }

通过这种设置,我得到了异常:

No registration for type SampleHub could be found and
an implicit registration could not be made. 
The ISampleRepository is registered as 'Web API Request' 
lifestyle, but the instance is requested outside the context of a Web API Request.

据我了解,这是预期的。但是,当我将存储库的 Lifestyle 更改为 Transient 时,我得到了完全相同的异常:

    var transientHybrid = Lifestyle.CreateHybrid(() => HttpContext.Current != null, new WebApiRequestLifestyle(), Lifestyle.Transient);
    container.Register<ISampleRepository, SampleRepository>(transientHybrid);

我怀疑问题可能出在HttpContext.Current != null检查它是否适用于 Web API,就像适用于 MVC 一样。

信号R 2.2

简单注入器2.8.3

我想念什么?

UPDATE:

这是 SignalR 如何创建集线器的堆栈跟踪:

at SimpleInjector.InstanceProducer.GetInstance()
   at SimpleInjector.Container.GetInstance(Type serviceType)
   at MyWebAbi.WebApiApplication.SimpleInjectorHubActivator.Create(HubDescriptor descriptor) in Global.asax.cs:line 108
   at Microsoft.AspNet.SignalR.Hubs.DefaultHubManager.ResolveHub(String hubName)
   at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.CreateHub(IRequest request, HubDescriptor descriptor, String connectionId, StateChangeTracker tracker, Boolean throwIfFailedToCreate)

所以正确的解决方案是使用ExecutionContextScope对于集线器,但需要明确关闭此范围,这使事情变得更加复杂......


您对混合生活方式的定义是不正确的。这WebApiRequestLifestyle不以任何方式依赖于HttpContext所以检查是否HttpContext.Current != null不管用。您必须通过调用来检查是否存在活动的 Web API 请求生活方式范围(或执行上下文范围,基本相同)container.GetCurrentExecutionContextScope():

var transientHybrid = Lifestyle.CreateHybrid(
    () => container.GetCurrentExecutionContextScope() != null, 
    new WebApiRequestLifestyle(), 
    Lifestyle.Transient);

但请注意,您应该非常小心构建范围生活方式和短暂生活方式的混合生活方式,因为这很容易产生错误的结果。这实际上是一些 DI 库的默认行为,但这是一个设计缺陷国际海事组织。我假设你非常有意识地注册了你的MyDbContext使用范围生活方式,因为您需要确保在整个请求中使用相同的实例。使用Transient生活方式意味着您可能会获得多种MyDbContext在请求期间。这可能不是问题,因为在您的集线器中,您当前可能只有一个对您的MyDbContext,但是一旦对象图发生变化并且第二次引用,您的代码可能会中断MyDbContext被添加。

因此,我建议不要使用这种生活方式的组合。相反,只需使用WebApiRequestLifestyle or the ExecutionContextScopeLifestyle(它们是相同的)并确保在解析集线器之前启动这样的执行上下文范围。

顺便说一句,不要忘记在 Simple Injector 中显式注册您的集线器。这允许简单注入器为您分析完整的对象图,包括您的集线器类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SignalR 中心中每个 web-api 请求的简单注入器依赖项 的相关文章

随机推荐

  • Maven Antrun 和依赖项

    请参阅下面的编辑 我不能只使用类路径的原因是因为我需要管理一些非java库 并且我正在编译一个非java项目 我正在尝试在 antrun 调用中使用 Maven 依赖项 遵循 Maven 站点上的文档 http maven apache o
  • 更改html中悬停时的选择列表选项背景颜色[重复]

    这个问题在这里已经有答案了 是否可以更改悬停时选择列表选项的默认背景颜色 HTML
  • SSIS 包中的“每批行”和“最大插入提交大小”是否有任何相关性?

    我有一个 SSIS 包 它将包含 1000 万条记录的 2 5 GB 数据导出到 Sql Server 数据库 该数据库有 10 个分区 包括主文件组 更改默认值之前最大插入提交大小即 2147483647 和每批次行数 使用快速加载选项完
  • C# Linq 列名称作为变量

    我有一个表 我想在其中对变量列进行查询 喜欢 private void query string column string value using var db new myDB var s1 from c in db Component
  • 在 Hive 中连接日期范围内的表

    我需要在employee id上 将tableA连接到tableB 并且表A中的cal date需要在表B的开始日期和结束日期之间 我运行了下面的查询并收到了下面的错误消息 请您帮我纠正和查询 谢谢你的帮助 JOIN date start
  • HTML/CSS 中的进度条

    dd position relative IE is dumb display block float left width 500px height 16px margin 0 0 2px background url white3 gi
  • 使用 Scrapy 使用“加载更多”按钮抓取无限滚动页面

    如何废弃一个无限滚动的网页 其中响应是 html text 而不是 json 我的第一次尝试是使用 Rule 和 LinkExtractor 它为我提供了大约 80 的职位 url class JobsetSpider CrawlSpide
  • 角度路径参数中的正斜杠

    如何设置我的路线 以便我的参数可以采用正斜杠 例如 myapp com file rootfolder subfolder myfile 这不起作用 const SECTION ROUTES Routes path file path co
  • 使用 Node JS 进行 HLS 流式传输

    我正在尝试使用 node js 流式传输 HLS 内容 但不知怎的 它不起作用 如果有人帮助我 那将会有很大的帮助 问题 尝试从 node js 提供 HLS 内容 不是直播 而是一组 ts 文件和 m3u8 播放列表 或者换句话说 VOD
  • 为什么 Createfile() 没有二进制标志

    Windows 编程的一大乐趣就是记住在所有文件打开调用中放入 wb 或 rb 或 ios binary 这样 Windows 就不会愉快地转换所有 0x13 我只需转换一堆很好的标准代码来使用 Createfile 来获取某个标志 我突然
  • Scala 泛型类的条件方法,具有类型参数的限制

    我相信泛型类可能仅在假设其类型参数符合一些附加限制的情况下才使其方法之一可用 例如 现场即兴编写的语法 trait Col T extends Traversable T def sum T lt Int T 0 this 我想我可以使用隐
  • 如何添加 SOAP 安全标头

    我读了很多文章和答案 但我无法解决 我在我的项目中使用 NET Framework 4 0 因此 我首先将 WebService 添加为服务引用 并在 app config 上获取绑定 我将列出我的尝试 尝试 1 我像这样实例化了服务并添加
  • 无法使用 Visual Studio 2015 命令行工具编译和链接简单的 C++ 程序

    使用 Visual Studio 2015 我无法再使用命令行工具编译和链接简单的 C 程序 考虑 main cpp include
  • Geochart:使用 ISO 3266-2 区域代码但显示真实姓名

    我正在使用Google 可视化 Geochart API创建一个国家地区的地图 我提供ISO 3266 2 国家细分代码并得到正确的结果 然而 在图表中将 ISO 3266 2 代码显示为标签是一种糟糕的用户体验 所以我想提供一个自定义标签
  • 使用代码启动 Photoshop 操作

    是否可以使用代码启动 Photoshop 操作 我的意思是通过批处理文件在 Photoshop 中启动该操作 或类似的东西 较新版本的 Photoshop CS5 和 CS6 是我使用过的唯一版本 支持一项称为Droplets它允许您创建可
  • 是否可以将 MyBatis 和 QueryDSL/jOOQ 结合起来?

    MyBatis 提供开箱即用的映射 本地缓存和日志记录 QueryDSL jOOQ 提供 SQL 语句的编译时检查和 IDE 自动完成功能 是否可以将它们结合起来 换句话说 我想使用 QueryDSL 或 jOOQ 创建一个查询 然后使用
  • java:字符串数组列表并删除

    在这样的测试中 Test public void test List
  • 强制 Flex 更新屏幕?

    这可能是一个初学者的问题 但我一生都无法弄清楚 我正在使用 Flex 为一个大型项目开发 GUI 特别是底部的状态栏 在我的 StatusBar 类中是一个 ProgressBar 其他正在工作的类可以告诉它在进展时更新 更改栏完成和标签
  • 登录表单是否需要令牌来抵御 CSRF 攻击?

    据我目前所知 令牌的目的是防止攻击者伪造表单提交 例如 如果网站有一个表单将添加的商品输入到您的购物车 那么攻击者可能会向您的购物车发送您不想要的商品 这是有道理的 因为购物车表单可能有多个有效输入 攻击者所要做的就是知道网站正在销售的商品
  • SignalR 中心中每个 web-api 请求的简单注入器依赖项

    根据this发布后 应该可以将每个网络请求的依赖项注入 SignalR 集线器 尽管有一些限制 例如 OnDisconnected 方法的问题 就我而言 它是 ASP Web API 不是 MVC 但由于某种原因它不起作用 以下是相关部分