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应用的一部分来用,你需要:
- 完成所有标准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容器的文档。
SignalR集成Autofac的更多相关文章
- ABP官方文档翻译 8.2 SignalR集成
SignalR集成 介绍 安装 服务器端 客户端 建立连接 內建特征 通知 在线客户端 PascalCase与CamelCase对比 你的SignalR代码 介绍 ABP中的Abp.Web.Signa ...
- .NET手记-为ASP.NET MVC程序集成Autofac
MVC Autofac总是会紧跟最新版本的ASP.NET MVC框架,所以文档也会一直保持更新.一般来讲,不同版本的框架集成Autofac的方法一般不变. MVC集成需要引用 Autofac.Mvc5 ...
- ABP文档 - SignalR 集成
文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...
- ABP理论学习之SignalR集成
返回总目录 本篇目录 介绍 安装 建立连接 内置功能 你自己的SignaR代码 介绍 Abp.Web.SignalR 使得在基于ABP的应用程序中使用 SignalR相当容易.查看SignalR文档获 ...
- 从零开始,搭建博客系统MVC5+EF6搭建框架(2),测试添加数据、集成Autofac依赖注入
一.测试仓储层.业务层是否能实现对数据库表的操作 1.创建IsysUserInfoRepository接口来继承IBaseRepository父接口 namespace Wchl.WMBlog.IRe ...
- 【干货】利用MVC5+EF6搭建博客系统(二)测试添加数据、集成Autofac依赖注入
PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.测试仓储层.业务层是否能实现对数据库表的操作 1.在52MVCBlog.IRepository程序集下创建IsysUserInf ...
- .net core 集成 autofac.
1. Install Install-Package Autofac Install-Package Autofac.Extensions.DependencyInjection 2.Startup ...
- 依赖注入在 dotnet core 中实现与使用:4. 集成 Autofac
本示例使用 .net core 5 rc-1 实现. 1. 添加 Nuget 包引用 使用 Autofac 当然要添加 Autofac 的 Nuget 包,主要涉及到两个: Autofac.Exten ...
- 使用 Castle 实现 AOP,以及 Autofac 集成 Castle
Castle 是 2003 年诞生于 Apache Avalon 项目,目的是为了创建一个IOC 框架.发展到现在已经有四个组件: ORM组件:ActiveRecord IOC组件:Windsor 动 ...
随机推荐
- java中构造函数的特点
构造函数的名字必须和类名完全相同,构造函数不能有 返回值,就是void 也不要写,构造函数不可以被子类继承 构造函数可以重载但是不可以被子类覆盖. 简单的例子 class A{ A(){ } A(in ...
- 数据挖掘:基于Spark+HanLP实现影视评论关键词抽取(1)
1. 背景 近日项目要求基于爬取的影视评论信息,抽取影视的关键字信息.考虑到影视评论数据量较大,因此采用Spark处理框架.关键词提取的处理主要包含分词+算法抽取两部分.目前分词工具包较为主流的,包括 ...
- C++程序设计基础(8)main函数
注:读<程序员面试笔记>笔记总结 1.知识点 (2)main函数的形式 //first type int main() //second type int main(int argc,ch ...
- rsync的配置
1. 安装rsync,如果要讲1.1.1.1的数据备份到2.2.2.2上,则在1.1.1.1上配置如下: /etc/rsyncd.conf uid = nobody gid = nobody use ...
- c#-FrameWork01
Framwork ArrayList l 集合类似于数组,同样是用来存放连续数据的,但集合的功能比数组更强大 l 集合和数组的最大区别:数组一旦定义以后就无法改变其大小,而集合可以动态的改变其大小 ...
- 亲测,很有效的忽略SSL证书方法
1.在httpclient发起请求时,有时会出现下面这种情况 你的日志中出现有关SSL的异常,javax.net.ssl.SSLPeerUnverifiedException: peer not au ...
- foreach的基本语法
有一个布尔型循环是专门用来循环数组的.这个循环的基本语法就是foreach基本语法 foreach( 要循环的数组变量 as [键变量 =>] 值变量){ //循环的内容 } 这是一个固定用法, ...
- IO流之流的操作规律
流的操作规律 IO流中对象很多,解决问题(处理设备上的数据时)到底该用哪个对象呢? 把IO流进行了规律的总结(四个明确): l 明确一:要操作的数据是数据源还是数据目的. 源:InputStream ...
- 洛谷P1351 联合权值(树形dp)
题意 题目链接 Sol 一道很简单的树形dp,然而被我写的这么长 分别记录下距离为\(1/2\)的点数,权值和,最大值.以及相邻儿子之间的贡献. 树形dp一波.. #include<bits/s ...
- bootstrap模态框实现相对定位拖拽
1.正常的拖拽是用绝对定位absolute来实现的,可是bootstrap的模态框是用relative,为了统一更改方便,就照着相对定位来实现拖拽效果. $(".modal .modal-h ...