2

MVC 4 プロジェクトで SignalR の調査を始めたばかりです。私がやりたいことの 1 つは、ハブ クラスに Ninject DI を追加することです。2 つの質問:

1) SignalR.Ninject を見つけてインストールしましたが、これで何をするのかよくわかりません。AppStart NinjectWebCommon ファイルの RegisterServices() メソッドに次の行を追加しようとしましたが、コンパイル エラーが発生しました。

private static void RegisterServices(IKernel kernel)
{
    kernel.Load(
        new Repositories.AssetModule()
    );

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

2) 正しく構成したら、Hub クラスでコンストラクター注入を使用できますか、それとも [Inject] 属性でプロパティ注入を使用する必要がありますか?

どんな方向性でも大歓迎です。

4

2 に答える 2

7

私も次のコンパイルエラーに苦労しました:

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

ただし、 NinjectDependencyResolver の内容を新しいクラスにコピーすることで、なんとか解決できました。

public class NinjectSignalRDependencyResolver : DefaultDependencyResolver
    {
        private readonly IKernel _kernel;

        public NinjectSignalRDependencyResolver(IKernel kernel) 
        {
            if (kernel == null)
            {
                throw new ArgumentNullException("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));
        }
    }

次に、クラス NinjectWebCommon (SignalR nuget によって提供される) のメソッド RegisterServices にリゾルバーを次のように設定します。

private static void RegisterServices(IKernel kernel)
{            
   RouteTable.Routes.MapHubs(new NinjectSignalRDependencyResolver(kernel));
}
于 2012-12-06T14:41:34.317 に答える
0

@TobiasNilsson の回答に従いましたが、このエラーが発生していました:「SignalR.NinjectSignalRDependencyResolver」から「Microsoft.AspNet.SignalR.HubConfiguration」に変換できません

private static void RegisterServices(IKernel kernel)
{
    GlobalHost.DependencyResolver = new NinjectSignalRDependencyResolver(kernel);
}       

それ以外の場合:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapHubs();//SignalR
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}
于 2013-03-25T21:53:28.440 に答える