【问题标题】:How to share SignalR singleton between multiple instance of Simple Injector如何在 Simple Injector 的多个实例之间共享 SignalR 单例
【发布时间】:2017-03-20 16:56:48
【问题描述】:

我正在使用 Simple Injector for IoC 和 Rebus(服务总线)来调度保存在多个队列(主题)中的事件。 Rebus 需要为每个队列配置一个新的 SimpleInjectorContainerAdapter

var bus = Configure.With(new SimpleInjectorContainerAdapter(container))

在这个配置阶段是不可能传递同一个Simple injector container实例,也不是同一个container adapter实例(容器出现IBus多次注册的错误)。

我还使用 SignalR 作为事件的处理程序之一,将事件分派给客户端。
this SignalR configuration tutorial 之后,我设置了几个集线器和相关事件通知器(应用程序中每个bounded context 一个)。
使用本教程示例中所示的经典单例模式很容易将相同的通知程序实例传递给容器的各种实例:
container.RegisterSingleton(Finishing.Notification.Notifier.Instance);

现在我想将实例创建委托给Simple Injector容器(只有一个),所以我开始关注this tutorial

        container.RegisterSingleton<Finishing.Notification.Notifier>();
        container.Register(() => GlobalHost.ConnectionManager.GetHubContext<Finishing.Notification.NotificationHub>().Clients);

问题在于,通过这种方式,我将为每个容器实例拥有 n 个通知器实例(非常遗憾)。

我知道我可以解决这个问题using a master container as Abstract Factory,但我正在寻找更具体的解决方案。
谢谢。

【问题讨论】:

  • 你试过override existing registrations解决原来的错误多次注册IBus吗?
  • 我能问一下,为什么您特别想避免服务定位器模式?看起来这很适合您的要求。
  • @ravi 我想避免使用服务定位器,因为我知道它是 anti-pattern
  • @ilcorvo,您必须在解决方案的上下文中考虑它。它不是所有场景中的反模式。

标签: singleton signalr inversion-of-control simple-injector rebus


【解决方案1】:

现在我想将实例创建委托给 Simple Injector 容器

(...)

问题是这样我将为每个容器实例创建 n 个通知器实例。

所以你希望每个容器都创建一个单例实例,但是每个容器都持有一个单例实例是一个问题……这不是矛盾吗?

【讨论】:

  • 可能我不清楚:我绝对不喜欢通知类的多个实例,所以我要求提示将实例从主容器传递到子容器,避免服务定位器模式。
  • 啊,那我明白了。所以它与 Rebus 并没有真正的关系,它更像是一个 SimpleInjector 问题?
猜你喜欢
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多