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时,可能需要进行一些 ...
随机推荐
- atitit.Oracle 9 10 11 12新特性attilax总结
atitit.Oracle 9 10 11 12新特性 1. ORACLE 11G新特性 1 1.1. oracle11G新特性 1 1.2. 审计 1 1.3. 1. 审计简介 1 1.4. ...
- atitit.软件开发概念--过滤和投影 数据操作
atitit.软件开发概念--过滤和投影 数据操作 投影的本质及扩展 物体在太阳光的照射下形成的影子(简称日影)就是平行投影.日影的方向可以反映时间 投影还比喻此物通过彼物表现出来的迹象. 作者::老 ...
- javascript递归、循环、迭代、遍历和枚举概念
javascript递归.循环.迭代.遍历和枚举概念 〓递归(recursion)在数学与计算机科学中,是指在函数的定义中使用函数自身的方法.递归一词还较常用于描述以自相似方法重复事物的过程.例如,当 ...
- [Objective C]super dealloc 调用时机
转自:http://dcm19872007.blog.163.com/blog/static/86519374201311953739818/ objective-c 语言中最头疼的事就是内存释放,申 ...
- jMiniLang设计思路
前言 项目地址:https://github.com/bajdcc/jMiniLang 演示视频:https://www.bilibili.com/video/av13294962 jMiniLang ...
- line: 1: Syntax error: word unexpected (expecting ")")
开发板上运行可执行程序报出错误: line1: 1: Syntax error: word unexpected (expecting ")") 解决思路: 1.编译器的问题 用a ...
- 实战 Lucene,第 1 部分: 初识 Lucene (zhuan)
http://www.ibm.com/developerworks/cn/Java/j-lo-lucene1/ ******************************************** ...
- FreeRTOS 调试方法(printf---打印任务执行情况)
以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家介绍 FreeRTOS 的调试方法,这里的调试方法主要是教会大家如何获取任务的执行情况,通过获取 ...
- c#开源项目[转]
一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(as ...
- [boostrap]debian下为arm创建debian和emdebian文件系统
转自:http://www.cnblogs.com/qiaoqiao2003/p/3738552.html Debian系统本身包含对arm的支持,其包含的软件包最多,但是最终的文件系统要大一些. e ...