2016-08-09 2 views
1

У меня есть проект SignalR 2, который также использует WebApi, и я пытаюсь интегрировать AutoFac в это.signalr, webapi и autofac

Первоначально мой класс запуска выглядит следующим образом:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    {   
     app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 

     app.MapSignalR(); 

     var httpConfig = new HttpConfiguration(); 

     httpConfig.MapHttpAttributeRoutes(); 

     app.UseWebApi(httpConfig); 
    } 
} 

, которая не использует autofac и все работает отлично. Теперь я пытаюсь добавить в AutoFac поэтому я изменил мой класс запуска, чтобы выглядеть следующим образом:

public void Configuration(IAppBuilder app) 
    { 
     var builder = new ContainerBuilder(); 

     var httpConfig = new HttpConfiguration(); 
     var hubConfig = new HubConfiguration(); 

     // Register your Web API controllers. 
     builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 
     builder.RegisterHubs(Assembly.GetExecutingAssembly()); 

     var container = builder.Build(); 
     httpConfig.DependencyResolver = new AutofacWebApiDependencyResolver(container); 
     hubConfig.Resolver = new AutofacDependencyResolver(container); 

     app.UseAutofacMiddleware(container); 
     app.MapSignalR("/signalr", hubConfig); 
     app.UseWebApi(httpConfig);    
    } 

Теперь то, что происходит, я не в состоянии совершать звонки на мой контроллер, как я получаю 404 каждый я делаю звонок, который работал раньше. Что мне не хватает? В руководстве по быстрому запуску autofac для web api есть вызов app.UseAutofacWebApi (config), однако этот метод не существует, поэтому не уверен, что это проблема или что.

+0

Итак, для каждого документа для интеграции WebAPI OWIN вы добавили пакет Autofac.WebApi2.Owin и расширение UseAutofacWebApi не существует? Вам это нужно. Можете ли вы дважды проверить? –

ответ

0

У меня была та же проблема. Для меня мне пришлось добавлять концентраторы индивидуально и использовать пакеты Nuget Autofac.SignalR версии 3.0.2 и SignalR.Extras.Autofac v1.2.0. Есть несколько пакетов Autofac SignalR, убедитесь, что это только те два.

Хотя я изменил и другие вещи. Вот как я это сделал. var builder = new ContainerBuilder();

// REGISTER CONTROLLERS SO DEPENDENCIES ARE CONSTRUCTOR INJECTED 
builder.RegisterControllers(typeof(MvcApplication).Assembly); 
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

// Register the SignalR hubs. 
builder.RegisterType<UpdateHub>().ExternallyOwned(); 
builder.RegisterType<NotificationHub>().ExternallyOwned(); 

// BUILD THE CONTAINER 
var container = builder.Build(); 

// Configure SignalR with an instance of the Autofac dependency resolver. 
GlobalHost.DependencyResolver = new Autofac.Integration.SignalR.AutofacDependencyResolver(container); 
DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(container)); 
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container); 

// REGISTER WITH OWIN 
app.UseAutofacMiddleware(container); 
app.UseAutofacMvc(); 
app.MapSignalR(); 

ConfigureAuth(app); 

Еще одна ошибка, которую я сделал, это думать, что сам концентратор может быть введен в контроллер. Вы не можете этого сделать, поэтому, если у вас есть необходимость в том, что вы должны делать через контекст концентратора, мне нужно найти способ для внедрения контекста концентратора. Это на моем деле.

var updateHubContext = GlobalHost.ConnectionManager.GetHubContext<UpdateHub>(); 
updateHubContext.Clients.All.update(); 

И если вам нужен пожизненный объем, вы должны решить вашу зависимость в концентратор с помощью интерфейса ILifetimeScope. Вам нужно ввести область жизни, а затем разрешить их.

private readonly ILifetimeScope _hubLifetimeScope; 
private readonly IEntityService<Update> _updateService; 

public UpdateHub(ILifetimeScope lifetimeScope) 
{ 
    //the AutofacWebRequest is important. It will not work without it 
    _hubLifetimeScope = lifetimeScope.BeginLifetimeScope("AutofacWebRequest"); 
    _updateService = _hubLifetimeScope.Resolve<IEntityService<Update>>(); 
} 

Надеюсь, это поможет. Javascript тот же из учебников на сайте. Ничего не меняется.

Смежные вопросы