SignalR集成Autofac
SignalR
SignalR集成需要 Autofac.SignalR NuGet 包。
SignalR 集成提供SignalR 集线器的依赖集成。由于 SignalR 是内部构件,所以不支持SignalR每请求的生命周期依赖。
这个文档主要是关于Autofac的,你有兴趣可以点击这里: 微软关于SignalR和依赖注入.
- 快速开始
- 注册集线器
- 设置依赖处理器
- 管理依赖生命周期
- OWIN 集成
快速开始
要使用 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应用的一部分来用,你需要:
- 完成所有标准SignalR 集成的资料。 - 注册控制器,设置依赖处理器等。
- 在 base基础 Autofac 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容器的文档。
转载于:https://www.cnblogs.com/icoolno1/p/6943630.html
SignalR集成Autofac相关推荐
- 入门系列-集成 Autofac
集成 Autofac Autofac 是.Net世界中最常用的依赖注入框架之一. 相比.Net Core标准的依赖注入库, 它提供了更多高级特性, 比如动态代理和属性注入. 安装 Autofac 所有 ...
- 跟我一起学.NetCore之Asp.NetCore中集成Autofac扩展
前言 前两节针对.NetCore自带的依赖注入进行简要概述,对于日常开发的需求应该是能满足了,那为什么还需要引入第三方依赖注入组件呢,这里就从自带的依赖注入来分析,有什么样的需求满足不了?主要归纳为以 ...
- .net core 集成 autofac.
1. Install Install-Package Autofac Install-Package Autofac.Extensions.DependencyInjection 2.Startup ...
- ASP.NET Core 依赖注入-集成 Autofac
概述 ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式,这是一种在类及其依赖关系之间实现控制反转 (IoC) 的技术. 默认服务容器是 Microsoft.Extensions.De ...
- 使用 Autofac 进行依赖注入
先说下为什么翻译这篇文章,既定的方向是架构,然后为了学习架构就去学习一些架构模式.设计思想. 突然有一天发现依赖注入这种技能.为了使得架构可测试.易维护.可扩展,需要架构设计为松耦合类型,简单的说也就 ...
- Castle DynamicProxy基本用法(AOP)
本文介绍AOP编程的基本概念.Castle DynamicProxy(DP)的基本用法,使用第三方扩展实现对异步(async)的支持,结合Autofac演示如何实现AOP编程. AOP 百科中关于AO ...
- ABP官方文档翻译 0.0 ABP官方文档翻译目录
一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来
基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 转载于:https://github.com/Meowv/Blog.git 本篇文章将给项目进行瘦身,删掉对 ...
- 因MemoryCache闹了个笑话
前言 是这么一回事: 我正在苦思一个业务逻辑,捋着我还剩不多的秀发,一时陷入冥想中-- 突然聊天图标一顿猛闪,打开一看,有同事语音: 大概意思是:同事把项目中Redis部分缓存换成MemoryCach ...
最新文章
- linux环境调用gsoap,Linux下gSOAP的使用 (c++)
- mediawiki安装使用
- 12个球问题--微软面试题
- linux网络协议栈之数据包处理过程,Linux网络协议栈之数据包处理过程
- 与mysql数据库的交互实战_实战教程丨五步教你优雅地在Windows下安装MySQL数据库...
- HDU - 5573 Binary Tree(思维+构造+二进制)
- Android listview优化以及listview混合itemview
- 程序员30岁之前如何月入五万
- Android播放器之SurfaceView与GLSurfaceView
- iOS编写最简单的界面切换应用
- HTML(一):HTML基本元素标签
- 潘多拉路由器固件备份
- 微信小程序4-小程序的api
- 【笔记17】使用 jad 工具把 java 的 class 文件转换为 java 文件;使用 luyten 把 java 的 jar 包转换为 java文件
- 简单的 js 日历控件
- PxCook 点击设计稿即可生成代码前端,高效智能的设计研发工具,智能标注软件。...
- win凭据添加计算机名,手动添加Windows凭据,彻底解决Win7系统打印共享-win7添加打印机...
- 解决WPS每点击一下保存,就会出现tmp文件
- 将爬取的实习僧网站数据传入HDFS
- Cygwin 下载安装
热门文章
- 读写EEPROM遇到的问题:16位地址的内容都是最后写入的数据。
- CTFshow php特性 web128
- CTFshow 信息收集 web13
- 在Matlab符号计算中灵活运用assume
- android 工作 绝望,我的人生绝望手游
- 使用ffmpeg裁剪和合并视频
- phpstorm配置Xdebug进行调试PHP教程
- RequestWindowFeature
- 猴子管理法则(网络文摘)
- 关于HtmlParser中Parser【org.htmlparser.Parser】这个类奇怪的地方...求解释【已获得解释】...