如何将现有 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/