上一编讲了 cap2.6 的快速入门, 这次我们来讲讲在控制台中如何使用 cap2.6. 因为 cap2.6 的内存模式目前已经可以使用了, 相关组件已经更新, 所以这次我们以简单的内存模式为例.
1: 创建项目
创建一个名叫 CAPConsoleDemo 的 "控制台应用 (.NET Core)" 程序,.netcore 版本要求在 2.2 或以上.
2: 添加相关引用
在 nuget 中添加 DotNetCore.CAP DotNetCore.CAP.InMemoryStorage Savorboard.CAP.InMemoryMessageQueue Microsoft.Extensions.Hosting 等组件的引用.
3: 构建常规 Host 主机
常规 host 主机是. net core 2.1 中引入的, 本质是移除了 web 功能的 webhost, 以前 webhost 的所有依赖注入, 生命周期管理, 日志管理等都可以在控制台程序中使用. 以后 webhost 都会是基于常规 host 来实现的.
实现方式也很简单, 只要将 Programe.cs 中改成下面这样就好了
- using Microsoft.Extensions.DependencyInjection;
- using Microsoft.Extensions.Hosting;
- using Savorboard.CAP.InMemoryMessageQueue;
- using System;
- namespace CAPConsoleDemo
- {
- class Program
- {
- static void Main(string[] args)
- {
- CreateHostBuilder(args).Build().Run(); // 构建一个常规 Host
- }
- static IHostBuilder CreateHostBuilder(string[] args)
- {
- var build = new HostBuilder();
- build.ConfigureServices((hostContext, services) =>
- {
- services.AddCap(option => // 添加 CAP 框架
- {
- option.UseInMemoryStorage(); // 使用内存存储
- option.UseInMemoryMessageQueue(); // 使用内存队列
- option.UseDashboard(); // 添加监控仪表盘
- });
- });
- return build;
- }
- }
- }
4: 添加推送程序
4.1: 添加一个继承自 IHostedService 的 Publish 类, 并在里面创建一个定时器, 每秒推送一次事件.
- using DotNetCore.CAP;
- using Microsoft.Extensions.Hosting;
- using System;
- using System.Threading;
- using System.Threading.Tasks;
- namespace CAPConsoleDemo
- {
- public class Publish : IHostedService
- {
- private ICapPublisher capPublish; //CAP 发布程序
- private Timer _timer; // 定时器
- public Publish(ICapPublisher capPublish) // 自动注入 CAP 程序
- {
- this.capPublish = capPublish;
- }
- public Task StartAsync(CancellationToken cancellationToken)
- {
- _timer = new Timer(work, null, TimeSpan.Zero, TimeSpan.FromSeconds(1)); // 每秒运行一次推送任务
- return Task.CompletedTask;
- }
- private void work(object state)
- {
- capPublish.Publish<string>("Order.Created", DateTime.Now.ToString()); // 推送 Order.Created 事件
- Console.WriteLine("推送:" + DateTime.Now.ToString());
- }
- public Task StopAsync(CancellationToken cancellationToken)
- {
- return Task.CompletedTask;
- }
- }
- }
4.2: 在 Programe.CreateHostBuilder 方法中添加推送服务 services.AddHostedService<Publish>();
4.3:f5 运行程序, 此时是已经可以正常推送消息了.
5: 添加监听服务
5.1: 创建一个承继自 ICapSubscribe 接口的类 Events, 并监听 Order.Created 事件, 代码如下:
- using DotNetCore.CAP;
- using System;
- using System.Threading.Tasks;
- namespace ConsoleApp2
- {
- public class Events : ICapSubscribe
- {
- [CapSubscribe("Order.Created")] // 监听 Order.Created 事件
- public async Task OrderCreatedEventHand(string msg)
- {
- Console.WriteLine("-- 接收:"+ msg);
- }
- }
- }
5.2: 在在 Programe.CreateHostBuilder 方法中添加监听服务 services.AddSingleton<ICapSubscribe, Events>();
6: 大功造成
F5 运行程序, 可以看到程序在一边推送一边接收.
7: 同一事件, 多个服务监听处理.
默认情况下, 一个事件只会被一个监听者处理, 即使我们创建了多个服务来监听同一事件, 也只会有一个服务收到此事件, 其它服务是收不到的. 那么怎么让多个服务同时处理同一事件呢? 答案是使用分组, 在添加监听器时使用不同的分组名称.
7.1: 我们将 Events 类中的代码, 稍微改动一下, 使用两个都监听 Order.Created 事件的方法, 但命名成不同的分组.
- using DotNetCore.CAP;
- using System;
- using System.Threading.Tasks;
- namespace CAPConsoleDemo
- {
- public class Events : ICapSubscribe
- {
- [CapSubscribe("Order.Created", Group = "Group1")] // 监听 Order.Created 事件, 并命名为 Group1
- public async Task OrderCreatedEventHand(string msg)
- {
- Console.WriteLine("--Group1 接收:" + msg);
- }
- [CapSubscribe("Order.Created", Group = "Group2")] // 监听 Order.Created 事件, 并命名为 Group2
- public async Task Group2(string msg)
- {
- Console.WriteLine("--Group2 接收:" + msg);
- }
- }
- }
7.2:F5 运行, 如下图所示, 一次推送事件, 两个监听服务都处理了此事件.
示例代码下载: https://pan.baidu.com/s/1X2uCvcLjQ9AiqxMD3CtTcA
来源: https://www.cnblogs.com/sunyuliang/p/11447565.html