Using Simple Injector with SignalR

c#, signalr, simple-injector

Solution

Well, I tried yesterday and I've found a solution. According to me, the only moment where I want dependency injection in SignalR is for my hubs: I don't care about how SignalR is working inside ! So instead of replacing the DependencyResolver, I created my own implementation of IHubActivator :

public class SimpleInjectorHubActivator : IHubActivator
{
    private readonly Container _container;

    public SimpleInjectorHubActivator(Container container)
    {
        _container = container;
    }

    public IHub Create(HubDescriptor descriptor)
    {
        return (IHub)_container.GetInstance(descriptor.HubType);
    }
}

That I can register like this (in Application_Start) :

var activator = new SimpleInjectorHubActivator(container);
GlobalHost.DependencyResolver.Register(typeof(IHubActivator), () => activator);
RouteTable.Routes.MapHubs();

Problem

I thought using my own IoC would be pretty straight forward with SignalR and maybe it is; most likely I'm doing something wrong. Here's my code I have so far: ``` private static void InitializeContainer(Container container) { container.Register<IMongoHelper<UserDocument>, MongoHelper<UserDocument>>(); // ... registrations like about and then: var resolver = new SimpleInjectorResolver(container); GlobalHost.DependencyResolver = resolver; } ``` and then my class: ``` public class SimpleInjectorResolver : DefaultDependencyResolver { private Container _container; public SimpleInjectorResolver(Container container) { _container = container; } public override object GetService(Type serviceType) { return _container.GetInstance(serviceType) ?? base.GetService(serviceType); } public override IEnumerable<object> GetServices(Type serviceType) { return _container.GetAllInstances(serviceType) ?? base.GetServices(serviceType); } } ``` What ends up happening is I get an error that IJavaScriptProxyGenerator can't be resolved, so I think, well I'll add the registration: ``` container.Register<IJavaScriptProxyGenerator, DefaultJavaScriptProxyGenerator>( ConstructorSelector.MostParameters); ``` but then there are a bunch of others! I get to: ``` container.Register<IDependencyResolver, SimpleInjectorResolver>(); container.Register<IJavaScriptMinifier, NullJavaScriptMinifier>(); container.Register<IJavaScriptProxyGenerator, DefaultJavaScriptProxyGenerator>( ConstructorSelector.MostParameters); container.Register<IHubManager, DefaultHubManager>(); container.Register<IHubActivator, DefaultHubActivator>(); container.Register<IParameterResolver, DefaultParameterResolver>(); container.Register<IMessageBus, InProcessMessageBus>(ConstructorSelector.MostParameters); ``` Which still gives me "No registration for type `ITraceManager` could be found." ... but now I'm wondering if I'm doing this right at all as I hoping I wouldn't need to re-wire everything SignalR is doing...right? Hopefully? If not I'll keep trudging along but I'm a SignalR and Simple Injector newb so thought I'd ask first. :) Additional: https://cuttingedge.it/blogs/steven/pivot/entry.php?id=88 since SignalR had multiple constructors.

Original source

Related problems