Проблемы с SignalR с SignalR.Ninject и перевес IConnectionIdFactory - PullRequest
0 голосов
/ 02 марта 2012

У меня есть все биты Nuget для SignalR, я пытаюсь использовать свои собственные clientIDs, а также контейнер внедрения зависимостей, который поставляется с SignalR, для всех других моих репозиториев и тому подобного. Теперь странно то, что jQuery не может подключиться к концентратору:

 debugger;
        // Proxy created on the fly
        var chat = $.connection.chat;

По сути, объект чата становится неопределенным, как будто SignalR не может быть разрешен. Это начало происходить, когда я попытался переопределить распознаватель по умолчанию для SignalR с кодом ниже.

Что мне здесь не хватает?

Другая проблема, с которой я столкнулся, заключается в том, что я не уверен, что мой UserClientIDfactory реализует IConnectionIdFactory. работает либо.

Вот код MVC3 в моем Global.asax

private static IKernel CreateKernel()
  {
      var kernel = new StandardKernel();
      RegisterServices(kernel);
      return kernel;
  }



private static void RegisterServices(IKernel kernel)
  {

      kernel.Bind<UserIdClientIdFactory>()
       .To<UserIdClientIdFactory>()
         .InRequestScope();         

         //Rest of the other stuff to inject
   }



protected void Application_Start()
    {

        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

      //ninject calls to create the kernal etc
        IKernel kernel = CreateKernel();

      //TO DO using signal IR resolver
        var resolver = new NinjectDependencyResolver(kernel);
        SignalR.Hosting.AspNet.AspNetHost.SetResolver(resolver);
    }

Наконец, вот код для моей собственной clientIDfactory

public class UserIdClientIdFactory : IConnectionIdFactory
{


#region IConnectionIdFactory Members

string IConnectionIdFactory.CreateConnectionId(SignalR.Hosting.IRequest request)
{
    // get and return the UserId here, in my app it is stored 
    // in a custom IIdentity object, but you get the idea 


    return HttpContext.Current.User.Identity.Name != null ?
    //TO DO change to get profileID from Appfabric or the database and log user infor   
         HttpContext.Current.User.Identity.Name.ToString() :
         Guid.NewGuid().ToString();
}
#endregion
} 

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Когда я читаю ваш вопрос, вы спрашиваете, как сделать правильное внедрение зависимостей в ASP.NET MVC и SignalR, используя один и тот же DI-контейнер (и, следовательно, нужно только объявлять привязки в одном месте).Если это правильно поняли, я однажды написал сообщение в блоге об этом: http://lcdev.dk/2012/02/14/using-signalr-ninject-with-asp-net-mvc3-and-the-ninject-mvc3-nuget-package/

В сообщении в блоге я предполагаю, что вы используете ASP.NET MVC3, а также Ninject.MVC3 и SignalR.Ninject.Пакеты Nuget.

Однако, если это не так, у меня есть комментарий к вашему коду.Мне кажется, что ядро, из которого вы делали привязки (в RegisterServices), не является ядром, которое вы фактически регистрируете в SignalR.И если это так, то, конечно, SignalR не будет знать о ваших предполагаемых привязках и может выдать исключение в результате использования вами ссылки на необъявленный объект -> что может объяснить, почему вы больше не можете подключиться к своемуЦентр SignalR.

0 голосов
/ 02 марта 2012

хорошо, спасибо за ваш пост, заставил меня заняться еще копанием, я прочитал остальную часть поста, на которую вы ссылались, о том, как использовать Ninject с MVC3, что привело меня к пониманию, что у меня есть ninject, но нет битов Nuget для Ninject Mvc3, я добавил это и изменил мой global.asax, используя следующий пост

http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/

вот рабочий код в gloabal.asax. Я также удалил загрузчик, который NinJect mvc3 добавил в папку запуска приложения, так как он работает в приведенном выше посте

public class MvcApplication : NinjectHttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

        public static void RegisterRoutes(RouteCollection routes)
        {


            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");           
            //routes.IgnoreRoute("{*allaxd}", new { allaxd = @".*\.axd(/.*)?" });  //added for mango chat



            routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );






        }

      public override void Init()
        {
            this.AuthenticateRequest += new EventHandler(MvcApplication_AuthenticateRequest);
            this.PostAuthenticateRequest += new EventHandler(MvcApplication_PostAuthenticateRequest);
            base.Init();
        }


      #region "Ninject stuff for dependancy Injection

      /// <summary>
      /// Creates the kernel that will manage your application.
      /// </summary>
      /// <returns>The created kernel.</returns>
      protected override IKernel CreateKernel()
      { 
          var kernel = new StandardKernel();
         // kernel.Load(Assembly.GetExecutingAssembly());
          RegisterServices(kernel);
          return kernel; 
      }

      /// <summary>
      /// Load your modules or register your services here!
      /// </summary>
      /// <param name="kernel">The kernel.</param>
      private static void RegisterServices(IKernel kernel)
      {


          kernel.Bind<UserIdClientIdFactory>()
           .To<UserIdClientIdFactory>()
             .InRequestScope();         


          SignalR.Hosting.AspNet.AspNetHost.DependencyResolver.Register(typeof(IConnectionIdFactory), () => new UserIdClientIdFactory());




      }

      #endregion

      protected override void OnApplicationStarted() 
      {
          base.OnApplicationStarted();
          //for project awesome
          ModelMetadataProviders.Current = new AwesomeModelMetadataProvider();
          AreaRegistration.RegisterAllAreas(); 
          RegisterGlobalFilters(GlobalFilters.Filters);
          RegisterRoutes(RouteTable.Routes); 

      }













    }
...