• SignalR集成Autofac


    SignalR

    SignalR集成需要 Autofac.SignalR NuGet 包

    SignalR 集成提供SignalR 集线器的依赖集成。由于 SignalR 是内部构件,所以不支持SignalR每请求的生命周期依赖。

    这个文档主要是关于Autofac的,你有兴趣可以点击这里: 微软关于SignalR和依赖注入.

    快速开始

    要使用 Autofac 集成 SignalR 你得引用SignalR集成的 NuGet 包,然后注册集线器,并设置依赖处理器。

    protected void Application_Start()
    {
      var builder = new ContainerBuilder();
    
      // 注册SignalR 集线器.
      builder.RegisterHubs(Assembly.GetExecutingAssembly());
    
      // 将依赖处理器设置成Autofac.
      var container = builder.Build();
      GlobalHost.DependencyResolver = new AutofacDependencyResolver(container);
    }
    

    下一节关于这些功能的细节,以及如何使用它们。

    注册集线器

    程序启动时同时建立 Autofac 容器,你需要注册 SignalR 集线器及其依赖。通常是在OWIN startup 类或 Global.asax中的 Application_Start 中进行。

    var builder = new ContainerBuilder();
    
    // 扫描程序集一次性加载...
    builder.RegisterHubs(Assembly.GetExecutingAssembly());
    
    // ...手动单个注册.
    builder.RegisterType<ChatHub>().ExternallyOwned();
    

    如果你注册单个的集线器,确保是作为 ExternallyOwned()来注册的。这是为让SignalR来控制集线的销毁而不是Autofac。

    设置依赖处理器

    将建好的容器传给 AutofacDependencyResolver 类的实例。将新处理器赋给 GlobalHost.DependencyResolver (OWIN的话是HubConfiguration.Resolver ) 让SignalR 使用AutofacDependencyResolver来定位服务。下边是IDependencyResolver 接口Autofac的实现。

    var container = builder.Build();
    GlobalHost.DependencyResolver = new AutofacDependencyResolver(container);
    

    管理依赖生命周期

    考虑到不支持每请求的依赖, 所有要处理的SignalR的依赖均来于根容器。

    • 如果你有 IDisposable 的组件,它们在应用程序的生命周期里一直存活原于Autofac 会 承载它们直到边界或容器销毁。 你必须将这些注册为 ExternallyOwned()。
    • 任何组件注册为InstancePerLifetimeScope() 都是单例的。假设只有一个生命周期范围,你只能获取一个实例。

    为了使您的集线器依赖生命周期更容易管理,您可以将根生命周期范围注入到集线器的构造函数中。下一步,创建一个子生命期范围,您可以在您的集线器调用的持续时间内使用,并解决所需的服务。最后,确保SignalR销毁集线器的时候销毁子生命期。(这类似于服务定位,但这是获得“每个集线器”范围的唯一方法。不,这不是很棒。)

    public class MyHub : Hub
    {
      private readonly ILifetimeScope _hubLifetimeScope;
      private readonly ILogger _logger;
    
      public MyHub(ILifetimeScope lifetimeScope)
      {
        // Create a lifetime scope for the hub.
        _hubLifetimeScope = lifetimeScope.BeginLifetimeScope();
    
        // Resolve dependencies from the hub lifetime scope.
        _logger = _hubLifetimeScope.Resolve<ILogger>();
      }
    
      public void Send(string message)
      {
        // You can use your dependency field here!
        _logger.Write("Received message: " + message);
    
        Clients.All.addMessage(message);
      }
    
      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);
      }
    }
    

    如果这是你程序里的常规模式,你可以考虑创建基/抽象集线器,让其它集线器继承以节省范围内的复制/粘贴,创建/销毁的步骤。

    向集线器中注入生命周期范围并不会产生每请求的范围。 仅仅给你一个管理依赖生命周期的方法,比在根容器中处理一切来得更有效的方法。使用InstancePerRequest,甚至在工作区,也是会失败的。更多信息见: the FAQ on per-request scope 。

    OWIN 集成

    如果 SignalR 作为OWIN应用的一部分来用,你需要:

    public class Startup
    {
      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);
    
        // To add custom HubPipeline modules, you have to get the HubPipeline
        // from the dependency resolver, for example:
        var hubPipeline = config.Resolver.Resolve<IHubPipeline>();
        hubPipeline.AddModule(new MyPipelineModule());
      }
    }
    

    OWIN 集成常见错误为使用GlobalHost。OWIN中配置你会抓狂. OWIN集成中,任何地方你都不能引用  点击这里查看微软关于这个和其它Ioc容器的文档。

  • 相关阅读:
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    MFC/.NET
    学习小结——记于华为2018届校园招聘宣讲会之后
    槽点今天未想到
  • 原文地址:https://www.cnblogs.com/icoolno1/p/6943630.html
Copyright © 2020-2023  润新知