2016-02-27 98 views
0

我使用我目前的天冬氨酸的项目,一切autofac定义无参数的构造函数正常工作,直到我决定使用扶养注射在signalR枢纽autofac与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。当您调用RegisterAssemblyTypes时,您可能会希望为IDiscussionService注册一项服务,但问题可能在那里。 –

回答

1

你应该注册你的中心ExternallyOwned它应该自己管理lifetimescope。这意味着autofac不会处理它们。

其次,一切都将从您的枢纽根容器解决。这意味着Per DependencyPer LifeTimeScope将与您的中心(永远与应用程序)住在一起。所以你应该在你的中心管理生命。

即使我们在您的集线器中管理生命周期,Per Request也不会受支持。因此,当我们创建新的生命周期时,我们将使用AutofacWebRequest标记创建它。这样,我们可以解决您的Per Request实例。但请注意,在正常的请求生命周期中,此实例将与其他实例的总数不同不同

集线器应该是这样的:

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