3
votes

I have a MVC 4 app where I'm using SignalR and a dependency injection framework. Thus, I needed to implement a custom DependencyResolver. In order to wire it up, I'm using

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

and everything works as expected. However, if I use a HubConfiguration object like this:

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

everything seems to work (the objects are correctly wired-up, there are no errors or warning whatsoever) but the remote methods are not invoked anymore. Can someone explain the difference between the first and the second approach?

2
You don't need to set the global resolver, if you set a custom resolver you cannot use global host for anything.davidfowl
@LarsHöppner's answer is the correct one.davidfowl

2 Answers

5
votes

I think Lars Höppner (the user who left the first comment on this post) is right.

You can definitely use a custom dependency resolver without changing GlobalHost.DependencyResolver (the SignalR test suite does this quite often), but you have to be sure GlobalHost doesn't show up anywhere else in your code.

This means that absolutely no references to:

  • GlobalHost.Configuration
  • GlobalHost.ConnectionManager
  • GlobalHost.TraceManager
  • GlobalHost.HubPipeline
  • and of course GlobalHost.DependencyResolver

The SO post Lars linked to (SignalR: Sending data using GlobalHost.ConnectionManager not working) shows you how to get the ConnectionManager from your custom dependency resolver; you can do the same thing for all the other properties on GlobalHost.

1
votes

I'm assuming you're performing the second approach yet still trying to use the GlobalHost dependency resolver.

If you wire your custom dependency resolver up via your second approach the GlobalHost's dependency resolver will not be the same as the one you pass into your custom hub configuration.

Therefore in order to still use the GlobalHost object you'll need to do your second approach AND set the GlobalHost dependency resolver:

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

Hope this helps!