浅析Mediator

本文详细介绍了如何运用Mediator模式轻松实现命令查询职责分离(CQRS)。首先,通过自定义命令类和IRequestHandler实现命令处理;接着,利用领域事件让处理更加优雅,通过CustomEvent和INotificationHandler实现事件的发布与订阅。最后,提供了源码下载供读者参考。

一、轻松实现命令查询职责分离模式(CQRS)

1.自定义命令类

代码如下(示例):

class CustomCommand : IRequest<long>
    {
        public string Name { get; set; }
    }

2.自定义实现IRequestHandler的类

CustomCommandHandler 通过泛型参数来关联CustomCommand

代码如下(示例):

class CustomCommandHandler : IRequestHandler<CustomCommand, long>
    {
        public Task<long> Handle(CustomCommand request, CancellationToken cancellationToken)
        {
            Console.WriteLine($"CustomCommand执行命令:{request.Name}");
            return Task.FromResult(100L);
        }
    }

3.通过Send来调用CustomCommand

代码如下(示例):

 var services = new ServiceCollection();
            var assembly = typeof(Program).Assembly;
            services.AddMediatR(assembly);
            var serviceProvider = services.BuildServiceProvider();
            var mediator = serviceProvider.GetService<IMediator>();
            mediator.Send(new CustomCommand() {Name="testName" });

二、让领域事件处理更加优雅

1.自定义CustomEvent类继承INotification

代码如下(示例):

class CustomEvent: INotification
    {
        public string Name { get; set; }
    }

2.自定义实现INotificationHandler的类

代码如下(示例):
CusotmEventHandler1 :

class CusotmEventHandler1 : INotificationHandler<CustomEvent>
    {
        public Task Handle(CustomEvent notification, CancellationToken cancellationToken)
        {
            Console.WriteLine($"CusotmEventHandler1 do sth:{notification.Name}");
            return Task.CompletedTask;
        }
    }

CusotmEventHandler2 :

 class CusotmEventHandler2 : INotificationHandler<CustomEvent>
    {
        public Task Handle(CustomEvent notification, CancellationToken cancellationToken)
        {
            Console.WriteLine($"CusotmEventHandler2 do sth:{notification.Name}");
            return Task.CompletedTask;
        }
    }

3.通过Publish来调用实现了INotificationHandler的类

代码如下(示例):

 var services = new ServiceCollection();
            var assembly = typeof(Program).Assembly;
            services.AddMediatR(assembly);
            var serviceProvider = services.BuildServiceProvider();
            var mediator = serviceProvider.GetService<IMediator>();
            await  mediator.Publish(new CustomEvent { Name = "testEventPublish" });

三、源码下载

下载

总结

Send是1:1,只能发送一个命令对象,后面的后覆盖前面的。
Publish是1:*,只要实现了INotificationHandler接口的类都能接受到消息。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值