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

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

发布时间:2020-12-16 07:12:54 所属栏目:asp.Net 来源:网络整理
导读:如何在SignalR 2.0中使用现有的IoC? 从教程中,我似乎需要设置一个通过属性从OWIN调用的类: using Microsoft.Owin;using Owin;[assembly: OwinStartup(typeof(SignalRChat.Startup))]namespace SignalRChat{ public class Startup { public void Configurat
如何在SignalR 2.0中使用现有的IoC?

从教程中,我似乎需要设置一个通过属性从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不知道我已经设置的容器.

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

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

解决方法

在我的例子中,我创建了一个自定义集线器激活器,它使用我的app和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

(编辑:李大同)

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

    推荐文章
      热点阅读