gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:49:02 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com