5

如何将现有的 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);
        }
    }
}

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

但是这里的问题是,与以前不同,看起来我不能MapSignalR从自己的代码中调用该方法。相反,我需要依靠 OWIN 为我做这件事。但是 OWIN 不知道我已经设置的容器。

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

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

4

1 回答 1

7

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

尝试以下操作:

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

于 2013-11-04T17:24:15.550 回答