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(1000);
            }
        }

给测试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

时间: 2024-10-13 15:56:29

SignalR 循序渐进(四) Hub的生命周期以及IoC的相关文章

Maven学习(四):生命周期与maven插件

一.maven 生命周期 (一)简介 Maven强大的一个重要的原因是它有一个十分完善的生命周期模型(lifecycle),这个生命周期可以从两方面来理解: 1.顾名思义,运行Maven的每个步骤都由它来定义的,这种预定义的默认行为使得我们使用Maven变得简单,相比而言,Ant的每个步骤都要你手工去定义. 2.这个模型是一种标准,在不同的项目中,使用Maven的接口是一样的,这样就不用去仔细理解每个项目的构建了,一般情况下,mvn clean install  这样的命令是通用的. 3.一个M

Android学习路线(十四)Activity生命周期——停止和重启(Stopping and Restarting)一个Activity

先占个位置,下次翻译~ :p Properly stopping and restarting your activity is an important process in the activity lifecycle that ensures your users perceive that your app is always alive and doesn't lose their progress. There are a few of key scenarios in which

微信小程序把玩(四)应用生命周期

原文:微信小程序把玩(四)应用生命周期 App() 函数用来注册一个小程序,注意必须在 app.js 中注册,且不能注册多个. 使用方式也跟Android中的Application中初始化一些全局信息以供使用. 方法: 应用生命周期代码:

Fragment(四)Fragment生命周期分析(转)

Fragment(四)Fragment生命周期分析 转载请注明:http://blog.csdn.net/liaoqianchuan00/article/details/24271607   例子一 从Layout中加载Fragment:   假设我们有一个Activity的Layout中有两个Fragment: <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=

非常道-中小软件公司项目管理(第四节 如何看待生命周期)

就软件开发项目而言,传统的生命周期基本重点是从需求分析开始,这当中会有个不大不小的问题,即“知识断层”.大部分软件项目中,项目经理接触项目通常是在合同签署后,这个时候就有一个很明显的断档,我相信有些项目经理没有过项目售前的经验(我不是指和销售人员跑跑客户讲讲方案演示下demo什么的),真正的项目售前其实是一个咨询的过程,这个过程要抓住客户,唯有四个字“提供价值”,这里的价值,表现为通过方案的描述,通俗易懂的描述能帮助客户解决什么问题,达到什么样的成果等等.这个阶段收集到的需求和目标才是客户最原始

线程八大基础核心四(线程生命周期)

1.引子 在java多线程并发编程中,有八大基础核心.考考你:看看都有哪八大基础核心呢?它们分别是: 1.创建线程的方式 2.线程启动 3.线程停止 4.线程生命周期 5.线程相关的方法 6.线程相关的属性 7.线程异常处理 8.线程安全 今天我们从第四个基础核心开始:线程生命周期 2.考考你 #前情回顾: 在java编程语言中,从线程创建,到线程执行结束,会经过一系列状态的转化,称为线程的生命周期 #考考你: 1.你知道线程生命周期中有哪些状态吗? 2.你知道各种状态对应的含义吗? 3.一图胜

多线程(四)线程生命周期和线程池

一.线程生命周期 线程的5种状态: 新建(New) ,就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead)     线程生命周期图: 二.线程池 1.为什么要使用线程池: (1).提高性能 系统启动一个新线程的成本是比较高的,而使用线程池避免了频繁的创建和销毁线程,可以很好地提高性能. 线程池在系统启动时即创建大量空闲的线程,程序将一个Runnable对象或Callable对象传给线程池,线程池就会自动 启动一个线程来执行它们的run()或call()方法,

跟厂长学PHP内核(四):生命周期之开始前的躁动

上一章我们对PHP的源码目录结构有了初步了解,本章我们继续从生命周期的维度对PHP进行剖析. 一.概览 生命周期是什么呢?你可以把它看作执行过程,PHP的生命周期也就是它从开始执行到结束执行的过程. PHP生命周期有五个阶段,分别为模块初始化阶段.请求初始化阶段.执行阶段.请求关闭阶段.模块关闭阶段.只是不同SAPI模式下,请求的情况略有不同,比如FastCGI下只经历了一次模块初始化阶段,接下来所有请求只经历请求初始化.执行脚本.请求关闭阶段. 在初步了解生命周期的五个阶段之后,我们先来讲述在

SignalR 循序渐进

SignalR 循序渐进(五)多个Hub服务器下的消息订阅 hellsoul86 2014-08-18 11:29 阅读:840 评论:7 SignalR 循序渐进(四) Hub的生命周期以及IoC hellsoul86 2014-07-29 16:55 阅读:953 评论:6 SignalR循序渐进(三)简易的集群通讯组件 hellsoul86 2014-06-27 01:39 阅读:1350 评论:7 SignalR循序渐进(二)泛型Hub hellsoul86 2014-05-24 21: