【问题标题】:Signalr + unity DI信号器 + 统一 DI
【发布时间】:2013-01-12 07:59:52
【问题描述】:

我已经通过常规方法在我的MVC4项目中成功使用了Signalr,方法是设置一个普通的集线器,包括JS文件/signalr/hubs,它可以工作。

现在我正在尝试统一设置 DI:

Global.asax

UnityContainer = Bootstrapper.Initialise();
var unityDependencyResolver = new UnityDependencyResolver(UnityContainer);

// Used for MVC
DependencyResolver.SetResolver(unityDependencyResolver);

// Used for SignalR
GlobalHost.DependencyResolver = new SignalRUnityDependencyResolver(UnityContainer);

RouteTable.Routes.MapHubs();

Bootstrapper.cs

public static IUnityContainer Initialise()
{
    var unityContainer = new UnityContainer();

    unityContainer.RegisterType<IUsers, Users>();

    unityContainer.RegisterType<ChatHub>(new InjectionFactory(CreateMyHub));

    return unityContainer;
}

private static object CreateMyHub(IUnityContainer p)
{
    return new ChatHub(p.Resolve<IUsers>());
}

还有集线器: 公共类 UserHub : 集线器 { 私有只读 IUsers _users;

public ChatHub(IUsers users)
{
    _users = users;
}

public void Send(String message)
{
    Clients.All.addMessage(message);
}

}

我的 SignalRUnityDependencyResolver.cs

public class SignalRUnityDependencyResolver : DefaultDependencyResolver
{
    private readonly IUnityContainer _container;

    public SignalRUnityDependencyResolver(IUnityContainer container)
    {
        if (container == null)
        {
            throw new ArgumentNullException("container", "Containet cannot be null");
        }
        _container = container;
    }

    public override Object GetService(Type serviceType)
    {
        return _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : base.GetService(serviceType);
    }

    public override IEnumerable<Object> GetServices(Type serviceType)
    {
        return _container.IsRegistered(serviceType) ? _container.ResolveAll(serviceType) : base.GetServices(serviceType);
    }
}

这适用于非集线器,因为所有依赖项都已解决,但现在不再生成 javascript 文件 &lt;script src="~/signalr/hubs"&gt;&lt;/script&gt;

如何调试这一代的 JS,哪里可能是罪魁祸首?

【问题讨论】:

  • 您可以发布您的完整Application_Start 方法吗?因为设置的顺序很重要:首先应该设置GlobalHost.DependencyResolver,然后设置RouteTable.Routes.MapHubs();,然后才调用RouteConfig.RegisterRoutes(RouteTable.Routes);
  • 我贴的是我有的,所以我会摆弄顺序。
  • 这是在您的集线器中注入 Unity 容器的另一种方法 stackoverflow.com/a/30887576/3000736

标签: asp.net-mvc-4 unity-container signalr


【解决方案1】:

你可以在配置中使用它 EnableJavaScriptProxies = false

这样的代码:

        app.Map("/signalr", map =>
        {
            map.UseCors(CorsOptions.AllowAll);
            var hubConfiguration = new HubConfiguration
            {
                EnableJSONP = true,

                EnableJavaScriptProxies = false
            };

            map.RunSignalR(hubConfiguration);
        });

【讨论】:

    猜你喜欢
    • 2020-02-16
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多