SignalR 循序渐进(四) Hub的生命周期以及IoC
有阵子没更新这个系列了,最近太忙了。本篇带来的是Hub的生命周期以及IoC。
首先,Hub的生命周期,我们用一个Demo来看看:
public class TestHub : Hub
{
public TestHub()
{
Console.WriteLine(Guid.NewGuid().ToString());
} public void Hello() { }
}
static HubConnection hubConnection;
static IHubProxy hubProxy;
static List<IDisposable> clientHandlers = new List<IDisposable>(); static void Main(string[] args)
{
hubConnection = new HubConnection("http://127.0.0.1:10086/");
hubProxy = hubConnection.CreateHubProxy("TestHub"); hubConnection.Start().ContinueWith(t =>
{
if (t.IsFaulted)
{
Console.WriteLine(t.Exception.Message);
}
else
{
Console.WriteLine("Connectioned");
}
}).Wait(); while (true)
{
hubProxy.Invoke("Hello");
Thread.Sleep();
}
}
给测试Hub增加构造函数,在里面输出一个Guid。然后客户端调用一个空的Hello方法。我们来看看实际运行情况:

可以看到,客户端每请求一次服务端,都会创建一个新的Hub实例来进行操作。
好,这是基本的应用场景。如果Hub里有一些需要持久的东西,比如一个访问计数器,我们把Hub改一下:
public class TestHub : Hub
{
int count; public TestHub()
{
Console.WriteLine(Guid.NewGuid().ToString());
} public void Hello()
{
count++;
Console.WriteLine(count);
}
}
这时候要怎么办呢?这时候就需要对Hub进行实例管理。在Startup里可以通过Ioc的方式将Hub的实例进行注入:
public class Startup
{
TestHub testHub = new TestHub(); public void Configuration(IAppBuilder app)
{
GlobalHost.DependencyResolver.Register(typeof(TestHub), () => testHub); app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration
{
EnableDetailedErrors = true,
EnableJSONP = true
};
map.RunSignalR(hubConfiguration);
});
}
}
这样改造后,我们再来看看实际运行情况:

好,目前来说一切都ok,我们能通过全局注册实例。现在有一个这样的需求,TestHub的构造函数需要注入一个仓储接口,例如:
public class TestHub : Hub
{
int count; public TestHub(IRepository repository)
{
this.repository = repository;
} IRepository repository; public void Hello()
{
count++;
repository.Save(count);
}
}
这样改完以后,势必需要在Startup里也做改动:
public class Startup
{
public Startup(IRepository repository)
{
testHub = new TestHub(repository);
} TestHub testHub; public void Configuration(IAppBuilder app)
{
GlobalHost.DependencyResolver.Register(typeof(TestHub), () => testHub); app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration
{
EnableDetailedErrors = true,
EnableJSONP = true
};
map.RunSignalR(hubConfiguration);
});
}
}
好,到这步位置,一切都在掌控之中,只要我们在入口的地方用自己熟悉的IoC组件把实例注入进来就ok了,如图:

WebApp.Start完全没有地方给予依赖注入,这条路走不通,看来得另寻方法。
Owin提供了第二种方式来启动,通过服务工厂来解决IoC的问题,而且是原生支持:
static void Main(string[] args)
{
var url = "http://*:10086/";
var serviceProviders = (ServiceProvider)ServicesFactory.Create();
var startOptions = new StartOptions(url);
serviceProviders.Add<IRepository, Repository>();
var hostingStarter = serviceProviders.GetService<IHostingStarter>(); hostingStarter.Start(startOptions);
Console.WriteLine("Server running on {0}", url);
Console.ReadLine();
}
我们将输出计数的位置挪到仓储实例里:
public class Repository : IRepository
{
public void Save(int count)
{
Console.WriteLine(count);
}
}
看一下最终的效果:

转载请注明出处:http://www.cnblogs.com/royding/p/3875915.html
SignalR 循序渐进(四) Hub的生命周期以及IoC的更多相关文章
- Fragment(四)Fragment生命周期分析(转)
Fragment(四)Fragment生命周期分析 转载请注明:http://blog.csdn.net/liaoqianchuan00/article/details/24271607 例子一 ...
- Angular 个人深究(四)【生命周期钩子】
Angular 个人深究(四)[生命周期钩子] 定义: 每个组件都有一个被 Angular 管理的生命周期. Angular 创建它,渲染它,创建并渲染它的子组件,在它被绑定的属性发生变化时检查它,并 ...
- 微信小程序把玩(四)应用生命周期
原文:微信小程序把玩(四)应用生命周期 App() 函数用来注册一个小程序,注意必须在 app.js 中注册,且不能注册多个. 使用方式也跟Android中的Application中初始化一些全局信息 ...
- spring源码学习(四)-spring生命周期用到的后置处理器
生命周期的九大后置处理器 第一次调用后置处理器org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory# ...
- maven权威指南学习笔记(四)—— maven生命周期(lifecycle)
定义: 生命周期是包含在一个项目构建中的一系列有序的阶段 举个例子来说就是maven 对一个工程进行: 验证(validate) -- 编译源码(compile) -- 编译测试源码(test-com ...
- Struts2-整理笔记(四)Action生命周期、如何获取参数(3种)、集合类型参数封装
一.Action生命周期 每次请求到来时,都会创建一个新的Action实例 Action是线程安全的,可以使用成员变量接收参数 二.获取参数的方式(3种) 1.属性驱动获得参数 每次请求Action时 ...
- React(四)组件生命周期
组件的生命周期可分成三个状态: Mounting:已插入真实 DOM Updating:正在被重新渲染 Unmounting:已移出真实 DOM 生命周期的方法有: componentWillMoun ...
- 跟厂长学PHP7内核(四):生命周期之开始前的躁动
上一章我们对PHP的源码目录结构有了初步了解,本章我们继续从生命周期的维度对PHP进行剖析. 一.概览 生命周期是什么呢?你可以把它看作执行过程,PHP的生命周期也就是它从开始执行到结束执行的过程. ...
- Spring(四)之Bean生命周期、BeanPost处理
一.Bean 生命周期 Spring bean的生命周期很容易理解.当bean被实例化时,可能需要执行一些初始化以使其进入可用状态.类似地,当不再需要bean并从容器中移除bean时,可能需要进行一些 ...
随机推荐
- [elk]elasticsearch dashboard+保留10天内索引+导入导出备份
es dashboard 有两款 head 这款我一直在用 https://github.com/mobz/elasticsearch-head 先修改es的配置文件: elasticsearch.y ...
- Vmware linux 无法上网
流程如下: 1)点击 VM->Settings Hardware选项卡下面 2)点击Network Adapter 设置如下图所示,首先我们在虚拟机中将网络配置设置成NAT, 3.进入Windo ...
- 执行git命令出现 xcrun: error:
xcrun: error: active developer path ("/Applications/Xcode.app/Contents/Developer") does no ...
- JSON特殊字符的处理
本文转自:http://blog.csdn.net/btt2013/article/details/66970735 JSon 数据中的String 传递数据时,需要处理好特殊字符. JSon数据中有 ...
- 基于jQuery的时间轴鼠标悬停动画插件
之前为大家分享了很多jquery插件,这次我们要来分享一款不太常见的jQuery插件,它是一个时间轴,时间轴上的每一个点在鼠标滑过时都可以显示该点的描述信息,并且鼠标滑过时都可以产生一定的动画特效,比 ...
- ASP.NET 5 将于2016年一季度公布
简单介绍:微软ASP.NET团队在GitHub宣布ASP.NET 5的公布时间表和发展蓝图. 该团队宣布在2015年还将公布三个Beta版.一个ASP.NET 5的抢先版(RC 1).到2016年一季 ...
- 安全 流程服务器开新机器 内外网 iptables 安全组 用户安全root用户的使用.
安全 流程服务器开新机器 内外网 iptables 安全组 用户安全root用户的使用.
- CSS实现文字半透明显示在图片上方法
CSS实现文字半透明显示在图片上方法 在css中文字半透明我们会需要使用滤镜效果也就是css中的filter:alpha来实现了,下面来看两个文字显示在图片上并且半透明的例子. CSS让一行文字显示在 ...
- 绑定QQ登录 PHP OAuth详解(转)
越来越多的网站开始采用 第三方账号登录 如qq 微博 开心网 等诸多流行的社交平台,利用第三方账号登录,可以更好地省去用户的注册时间,并且极大地提高用户体验,吸引更多的潜在用户. 让用户拥有 一个号码 ...
- MathType中如何快速输入空心字母
MathType输入数学公式时非常方便有效的,在文档中涉及到数学公式或者符号时都是使用MathType来进行的,因为它比Office自带的公式编辑器功能更为完善,使用起来更快捷.在数学公式中,在不同的 ...