Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ninject Dependency Injection for SignalR

In my NinjectWebCommon.cs file, under CreateKernel method I am applying the injection like this

private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);

        // Web API Injection
        GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);                     

        // SignalR Injection
        GlobalHost.DependencyResolver = new SignalR.Ninject.NinjectDependencyResolver(kernel);

        return kernel;
    }

I was thinking that should do it for me but i keep getting an error at the SignalR injection that

"Cannot implicitly convert type 'SignalR.Ninject.NinjectDependencyResolver' to 'Microsoft.AspNet.SignalR.IDependencyResolver'"

Any idea what the problem is?

like image 873
Bitsian Avatar asked Feb 05 '13 11:02

Bitsian


1 Answers

I am not sure if you have found the answer or not. They have changed the way DI works in SignalR as of version 1.0.0 and the SignalR.Ninject packages doesn't work - I have written a small blog post on this: http://myrandomcodesnippets.wordpress.com/2013/03/29/ninject-dependency-injection-with-signalr-1-0-1/

Basically you need to create your own implementation of this which is the same as the SignalR.Ninject implementation:

GlobalHost.DependencyResolver = new SignalRNinjectDependencyResolver(kernel);

When you create the new class it will want to inherit from IDependancyResolver don't bother with this and use:

public class SignalRNinjectDependencyResolver : DefaultDependencyResolver
{
    private readonly IKernel _kernel;

    public SignalRNinjectDependencyResolver(IKernel kernel)
    {
        _kernel = kernel;
    }

    public override object GetService(Type serviceType)
    {
        return _kernel.TryGet(serviceType) ?? base.GetService(serviceType);
    }

    public override IEnumerable<object> GetServices(Type serviceType)
    {
        return _kernel.GetAll(serviceType).Concat(base.GetServices(serviceType));
    }
}

Hope this helps.

like image 89
Matt Avatar answered Sep 22 '22 14:09

Matt