5
votes

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?

1
I'm not sure if the two are compatible, but you could attempt to typecast the dependency resolver to (Microsoft.AspNet.SignalR.IDependencyResolver) when you perform the assignment.Rudi Visser
It does remove the error, but the ninject dependency injection doesnt work. From the posts i have seen, this typecasting should never have been necessary in the first place.....dunno what the problem isBitsian
Are you sure that your NinjectDependencyResolver inherits from Microsoft.AspNet.SignalR.IDependencyResolver? Can you paste the code?Alex
I am not familiar with SignalR at all, you are using an "I"nterface on one side of the cast, but a "real object" on the other. Is there an "I"NinjectDependencyResolver?JcMaltaDev
@AlexG SignalR.Ninject.NinjectDependencyResolver is being provided by SignalR.Ninject library, so am just using that. And yes, it inherits from DefaultDependencyResolver which in turn inherits from IDependencyResolverBitsian

1 Answers

8
votes

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.