无法在HubConfiguration中将DependencyResolver传递给MapSignalR

时间:2014-01-08 08:23:28

标签: signalr

我有一个MVC 4应用程序,我正在使用SignalR和依赖注入框架。因此,我需要实现自定义DependencyResolver。为了连线,我正在使用

        var resolver = new CustomSignalRDependencyResolver(...);
        GlobalHost.DependencyResolver = resolver;
        app.MapSignalR();

一切都按预期工作。但是,如果我使用这样的HubConfiguration对象:

        var resolver = new CustomSignalRDependencyResolver(...);
        app.MapSignalR(new HubConfiguration(
            {
                Resolver = resolver
            });

所有似乎工作(对象正确连接,没有任何错误或警告)但远程方法不再被调用。有人可以解释第一种和第二种方法之间的区别吗?

2 个答案:

答案 0 :(得分:5)

我认为LarsHöppner(在这篇文章中留下第一条评论的用户)是对的。

您绝对可以使用自定义依赖项解析程序而无需更改GlobalHost.DependencyResolver(SignalR测试套件经常执行此操作),但您必须确保GlobalHost不会显示在代码中的任何其他位置

这意味着绝对没有引用:

  • GlobalHost.Configuration
  • GlobalHost.ConnectionManager
  • GlobalHost.TraceManager
  • GlobalHost.HubPipeline
  • 当然还有GlobalHost.DependencyResolver

链接到(SignalR: Sending data using GlobalHost.ConnectionManager not working)的SO帖子Lars向您展示了如何从自定义依赖项解析器获取ConnectionManager;你可以为GlobalHost上的所有其他属性做同样的事情。

答案 1 :(得分:1)

我假设您正在执行第二种方法,但仍尝试使用GlobalHost依赖项解析程序。

如果您通过第二种方法连接自定义依赖项解析程序,GlobalHost的依赖项解析程序将与您传递到自定义集线器配置的依赖项解析程序不同。

因此,为了仍然使用GlobalHost对象,您需要执行第二种方法并设置GlobalHost依赖项解析器:

var resolver = new CustomSignalRDependencyResolver(...);
app.MapSignalR(new HubConfiguration(
{
    Resolver = resolver
});
GlobalHost.DependencyResolver = resolver;

希望这有帮助!