2016-06-19 3 views
2

Autofac에서 작동하는 SignalR을 얻으려고합니다.IHubContext의 자동 주입 SignalR MVC

https://github.com/justsayno/signalr-autofac

이가 적용되는 GlobalHost 사용하여 작동 : 내가 여기서 무엇을했는지 나는의 다시 제거 버전의 환매 특약을 잘 사용하여 작동

https://github.com/sstorie/experiments/tree/master/angular2-signalr

했나 GlobalHost 목적. SignalF 서비스를 주입하는 방법에 대한 Autofac의 사이트에있는 문서를 따르려고했으나 제대로 작동하지 않습니다. 이것은 나의 종속 등록 내 설정 파일입니다

public static IContainer RegisterDependencies() 
    { 
     // Create your builder. 
     var builder = new ContainerBuilder(); 

     //register controllers in DI 
     builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
     builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

     // Register SignalR hubs 
     builder.RegisterHubs(Assembly.GetExecutingAssembly()); 

     return builder.Build(); 
    } 

을 그리고 startup.cs에서이 전화 :

public class Startup 
{ 
    public static IContainer Container { get; set; } 
    public void Configuration(IAppBuilder app) 
    { 
     var config = GlobalConfiguration.Configuration; 

     // configure IoC container 
     Container = AutofacConfiguration.RegisterDependencies(); 

     //set dependency resolver from WebAPI and MVC 
     config.DependencyResolver = new AutofacWebApiDependencyResolver(Container); 
     DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(Container)); 

     //register Autofac Middleware 
     app.UseAutofacMiddleware(Container); 

     app.Map("/signalr", a => 
     { 
      a.UseCors(CorsOptions.AllowAll); 
      var hubConfiguration = new HubConfiguration 
      { 
       Resolver = new Autofac.Integration.SignalR.AutofacDependencyResolver(Container) 
      }; 
      a.RunSignalR(hubConfiguration); 
     }); 

     // This server will be accessed by clients from other domains, so 
     // we open up CORS 
     // 
     app.UseCors(CorsOptions.AllowAll); 

     // Build up the WebAPI middleware 
     // 
     var httpConfig = new HttpConfiguration(); 
     httpConfig.MapHttpAttributeRoutes(); 
     app.UseWebApi(httpConfig); 
    } 

} 

그리고 나는 이것이 그 contstructor에 주입 한 컨트롤러가 있습니다

public TaskController(IHubContext hubContext) 
    { 
     // Commented out hard coded global host version 
     // 
     //_context = GlobalHost.ConnectionManager.GetHubContext<EventHub>(); 

     // using DI 
     _context = hubContext; 
    } 

이것은 그러나 나에게 기본 생성자가없는 컨트롤러에 대한 오류를 제공한다. (그래서 나는 이것이 내 IHubContext가 발견되지 않는 문제라고 생각한다).

도움이 될 것입니다. 나는 그것에 대해 이야기하는 완벽한 솔루션을 여기에서 찾을 수 있습니다하고 무엇을 REPO 만든 : 나는이 작업을 수행 할 수있었습니다

https://github.com/justsayno/signalr-autofac

답변

4

를하지만, 내가 좋아하는 일반적으로하는 것처럼 깨끗하지 않습니다. 여기서 가장 중요한 문제는 IHubContext가 허브의 특정 유형을 반영하지 않는다는 것입니다. 이는 단지 일반적인 핸들 일뿐입니다. 그래서 내가했던 것은 특정 SignalR 허브를 사용 IHubContext를 등록 Autofac 내 이름 등록을 만드는 것입니다 :

builder.Register(ctx => 
    ctx.Resolve<IDependencyResolver>() 
     .Resolve<IConnectionManager>() 
     .GetHubContext<EventHub>()) 
     .Named<IHubContext>("EventHub"); 

그럼 난에이 허브를 주입됩니다 객체에 대한 특정 등록을 설정합니다. 이것은 ApiController 또는 표준 Autofac/WebApi 통합을 사용하여 컨트롤러에 주입되는 다른 서비스 일 수 있습니다. 이 "특정"등록은 내가 좋아하지 않는 부분이지만, 나는 그 주위에 더 깨끗한 방법을 모른다.

builder.RegisterType<TaskController>() 
     .WithParameter(
      new ResolvedParameter(
       (pi, ctx) => pi.ParameterType == typeof(IHubContext), 
       (pi, ctx) => ctx.ResolveNamed<IHubContext>("EventHub") 
     ) 
); 

이제 Autofac 당신이 TaskController에 IHubContext을 주입하려는 인식하고 주입 할 때 EventHub라는 특정 등록을 제공해야한다 : 여기처럼 그 나타낸 것입니다.

+0

감사합니다. Sam. 명명 된 속성을 허브 자체에 추가해야합니까? 아니면 클래스 이름을 사용합니까? – sethreidnz

+0

등록 할 때 GetHubContext <>() 호출에서 사용한 클래스를 사용해야합니다. 내가 믿는 허브 자체에 아무 것도 추가 할 필요가 없습니다. –