2016-02-27 6 views
0

Я использую autofac на моем текущем проект Asp и все работает отлично, пока я не решил использовать инъекции зависимостей в signalR Hubautofac с signalr не конструктор без параметров определяются для этого объекта

вот мой класс запуска

public partial class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     ConfigureAuth(app); 
     var builder = new ContainerBuilder(); 
     builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
     builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerLifetimeScope(); 
     builder.RegisterType<DbFactory>().As<IDbFactory>().InstancePerLifetimeScope(); 
     //builder.RegisterHubs(Assembly.GetExecutingAssembly()); 
     builder.RegisterType<DiscussionHub>(); 
     // Repositories 
     builder.RegisterAssemblyTypes(typeof(LanguagesRepository).Assembly) 
      .Where(t => t.Name.EndsWith("Repository")) 
      .AsImplementedInterfaces().InstancePerRequest(); 
     // Services 
     builder.RegisterAssemblyTypes(typeof(LanguageService).Assembly) 
      .Where(t => t.Name.EndsWith("Service")) 
      .AsImplementedInterfaces().InstancePerRequest(); 

     IContainer container = builder.Build(); 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
     var config = new HubConfiguration 
     { 
      Resolver = new Autofac.Integration.SignalR.AutofacDependencyResolver(container) 
     }; 
     app.UseAutofacMiddleware(container); 
     AutoMapperConfiguration.Configure(); 
     app.MapSignalR("/signalr",config); 
    } 
} 

и вот мой концентратор

public class DiscussionHub : Hub 
{ 
    private readonly IDiscussionService _discussionService; 
    public DiscussionHub(IDiscussionService discussionService) 
    { 
     _discussionService = discussionService; 
    }} 

ошибка в том, что я не получаю не конструктор без параметров на мой хаб? любое предложение ?!

+0

Где вы регистрируете свой 'IDiscussionService' с помощью построителя контейнеров? – nemesv

+0

Я обновил свой код, вы можете его проверить –

+0

Попробуйте просто решить: IDiscussionService после создания вашего контейнера. Возможно, вы захотите зарегистрировать службу для IDiscussionService при вызове: RegisterAssemblyTypes, но проблема может быть там. –

ответ

1

Вам необходимо зарегистрировать концентратор ExternallyOwned, он должен сам управлять lifetimecope. Это означает, что autofac не будет их использовать.

Во-вторых, все будет разрешено из корневого контейнера в вашем концентраторе. Это означает, что Per Dependency или Per LifeTimeScope будут жить с вашим хабом (навсегда с приложением). Поэтому вы должны управлять пожизненным сроком службы в своем концентраторе.

Даже если мы управляем временем жизни в вашем концентраторе, Per Request не поддерживается. Из-за этого, когда мы создаем новый lifetimecope, мы создадим его с тегом AutofacWebRequest. Таким образом, мы можем решить ваш экземпляр Per Request. Но обратите внимание, что этот экземпляр будет totaly другой с другим экземпляром в обычном режиме lifetimecope.

Ваш концентратор должен быть таким:

public class DiscussionHub : Hub 
{ 
    private readonly ILifetimeScope _hubLifetimeScope; 
    private readonly IDiscussionService _discussionService; 

    public MyHub(ILifetimeScope lifetimeScope) 
    { 
    // Create a lifetime scope for the hub. 
    _hubLifetimeScope = lifetimeScope.BeginLifetimeScope("AutofacWebRequest"); 

    // Resolve dependencies from the hub lifetime scope. 
    _discussionService = _hubLifetimeScope.Resolve<IDiscussionService>(); 
    } 

    protected override void Dispose(bool disposing) 
    { 
    // Dipose the hub lifetime scope when the hub is disposed. 
    if (disposing && _hubLifetimeScope != null) 
    { 
     _hubLifetimeScope.Dispose(); 
    } 
    base.Dispose(disposing); 
    } 
} 

Ваш регистр должен быть таким:

. 
    . 
    builder.RegisterType<DiscussionHub>().ExternallyOwned(); 
    var container = builder.Build(); 
    GlobalHost.DependencyResolver = new Autofac.Integration.SignalR.AutofacDependencyResolver(container); 
    . 
    . 

Owin Интеграция:

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

    // STANDARD SIGNALR SETUP: 

    // Get your HubConfiguration. In OWIN, you'll create one 
    // rather than using GlobalHost. 
    var config = new HubConfiguration(); 

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

    // Set the dependency resolver to be Autofac. 
    var container = builder.Build(); 
    config.Resolver = new AutofacDependencyResolver(container); 

    // OWIN SIGNALR SETUP: 

    // Register the Autofac middleware FIRST, then the standard SignalR middleware. 
    app.UseAutofacMiddleware(container); 
    app.MapSignalR("/signalr", config); 
    } 

Проверить еще detail.