5

私のNinjectWebCommon.csファイルでは、CreateKernelメソッドの下で私はこのような注射を適用しています

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;
    }

私はそれが私のためにそれをするべきだと思っていましたが、SignalRインジェクションでエラーが発生し続けます

「タイプ'SignalR.Ninject.NinjectDependencyResolver'を'Microsoft.AspNet.SignalR.IDependencyResolver'に暗黙的に変換することはできません。」

問題が何であるかについて何か考えはありますか?

4

1 に答える 1

8

あなたが答えを見つけたかどうかはわかりません。バージョン1.0.0以降、SignalRでのDIの動作方法が変更され、SignalR.Ninjectパッケージが機能しません-これについて小さなブログ投稿を書きました:http://myrandomcodesnippets.wordpress.com/2013/03/ 29 / ninject-dependency-injection-with-signalr-1-0-1 /

基本的に、SignalR.Ninject実装と同じ、これの独自の実装を作成する必要があります。

GlobalHost.DependencyResolver = new SignalRNinjectDependencyResolver(kernel);

新しいクラスを作成するときは、IDependancyResolverから継承する必要があります。これを気にせず、次を使用してください。

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));
    }
}

お役に立てれば。

于 2013-03-29T14:53:10.950 に答える