asp.net - 在 SignalR 2.0 中使用现有的 IoC 容器

标签 asp.net dependency-injection inversion-of-control signalr owin

如何将现有 IoC 与 SignalR 2.0 结合使用?

从教程来看,我似乎需要设置一个通过属性从 OWIN 调用的类:

using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat
{
    public class Startup
    {
        public void Configuration(IAppBuilder app /*HOW AM I GONNA GET UNITY CONTAINER HERE?*/) 
        {
            var hubConfig = new HubConfiguration()
            {
                EnableJSONP = true,
                EnableDetailedErrors = true,
                EnableJavaScriptProxies = true,
                Resolver = new SignalRUnityDependencyResolver(container)  
            };


            // Any connection or hub wire up and configuration should go here
            app.MapSignalR(hubConfig);
        }
    }
}

这里的问题是我已经有一个容器,它是引导绑定(bind)的,并且容器中有需要与同一主机下共享的 MVC 应用程序共享的单例实例。

但是这里的问题是,与以前不同,我似乎无法从自己的代码中调用 MapSignalR 方法。相反,我需要依靠 OWIN 来帮我完成这件事。但是 OWIN 不知道我已经设置的容器。

解决这个问题的最佳方法是什么?我有一些非常粗略的想法,如何使用静态变量来保存其中的一些变量来组合解决方案 - 但我讨厌这样的想法。代码很脆弱,操作顺序很容易引入微妙的错误。

有没有办法在 OWIN 不调用上述方法的情况下获取 IAppBuilder 实例?这样我可以在 SignalR 初始化时更好地控制,并且可以将自己的 IoC 传递到配置中。

最佳答案

就我而言,我创建了一个自定义集线器激活器,它在我的应用程序和 signalR 之间使用共享容器(通过构造函数注入(inject)),这样您就可以为整个应用程序拥有单个复合根。

尝试以下操作:

public class CustomHubActivator : IHubActivator
    {
        private readonly Container _container;

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

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

在引导应用程序时注册您的自定义集线器激活器(可能是 global.asax)

 GlobalHost.DependencyResolver.Register(typeof (IHubActivator),
                                                   () => new CustomHubActivator(Container));

这是更简单的解决方案,而不是再次配置 signalR dependencyResolver

关于asp.net - 在 SignalR 2.0 中使用现有的 IoC 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19763002/

相关文章:

c# - 我可以有一个包含多个案例标准的 Switch 语句吗?

c# - 通过枚举值+依赖注入(inject)创建实例

wpf - Unity 的嵌套数据上下文

c# - 如何使用自定义 HttpClientHandler 配置对依赖于 HttpClient 的类进行单元测试/依赖项注入(inject)

asp.net - 我将如何使用 CSS 复制此 GridView 样式?

asp.net - 尝试将WebSite发布为单个DLL时,来自aspnet_merge的OutOfMemoryException

c# - Web 和 Winforms 的 .Net 身份验证

java - 为什么将 Spring DI 添加到 Jersey 1.19.1 会使我的资源成为单例?

java - IoC 在运行时决定具体实现

.net - 优先注册开放泛型