博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初学者浅度剖析eShopOnContainers 里面用到的MediatR .
阅读量:4329 次
发布时间:2019-06-06

本文共 5928 字,大约阅读时间需要 19 分钟。

一.介绍

   简单了解下开源项目 , , MediatR作者Jimmy Bogard :

Simple mediator implementation in .NETIn-process messaging with no dependencies.Supports request/response, commands, queries, notifications and events, synchronous and async with intelligent dispatching via C# generic variance. .NET中的简单中介实现 进程内没有依赖关系消息传递。支持以同步或异步的形式进行请求/响应,命令,查询,通知和事件的消息传递,并通过C#泛型支持消息的智能调度。

  MediatR实现Pipeline ,通过Autofac 注入Log, ,来实现管道里记录日志,管道里验证实体数据.

 

二.MediatR的使用

   1.安装NuGet包:

Install-Package MediatR.Extensions.Microsoft.DependencyInjectionFixed
Install-Package Autofac.Extensions.DependencyInjection

   2.修改Startup.cs文件

public IServiceProvider ConfigureServices(IServiceCollection services){      services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);      var container = new ContainerBuilder();      container.Populate(services);      container.RegisterModule(new MediatorModule());      return new AutofacServiceProvider(container.Build());}

   3.添加MediatorModule.cs文件

  添加 builder.RegisterGeneric(typeof(xxx<,>)).As(typeof(IPipelineBehavior<,>)); 按你添加的顺序执行管道

public class MediatorModule : Autofac.Module    {        protected override void Load(ContainerBuilder builder)        {            builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly)                .AsImplementedInterfaces();                         // Register all the Command classes (they implement IRequestHandler) in assembly holding the Commands            builder.RegisterAssemblyTypes(typeof(CreateOrderCommand).GetTypeInfo().Assembly)                .AsClosedTypesOf(typeof(IRequestHandler<,>));//             Register the DomainEventHandler classes (they implement INotificationHandler<>) in assembly holding the Domain Events//            builder.RegisterAssemblyTypes(typeof(ValuesController.Pings).GetTypeInfo().Assembly)//                .AsClosedTypesOf(typeof(INotificationHandler<>));            // Register the Command's Validators (Validators based on FluentValidation library)            builder                .RegisterAssemblyTypes(typeof(CreateOrderCommandValidator).GetTypeInfo().Assembly)                .Where(t => t.IsClosedTypeOf(typeof(IValidator<>)))                .AsImplementedInterfaces();            builder.Register
(context => { var componentContext = context.Resolve
(); return t => { object o; return componentContext.TryResolve(t, out o) ? o : null; }; }); builder.RegisterGeneric(typeof(LoggingBehavior<,>)).As(typeof(IPipelineBehavior<,>)); builder.RegisterGeneric(typeof(ValidatorBehavior<,>)).As(typeof(IPipelineBehavior<,>));// builder.RegisterGeneric(typeof(TransactionBehaviour<,>)).As(typeof(IPipelineBehavior<,>)); } }

 

 4.添加LoggingBehavior.cs文件

public class LoggingBehavior
: IPipelineBehavior
{ private readonly ILogger
> _logger; public LoggingBehavior(ILogger
> logger) => _logger = logger; public async Task
Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate
next) { _logger.LogInformation("----- Handling command {CommandName} ({@Command})", request.GetGenericTypeName(), request); var response = await next(); _logger.LogInformation("----- Command {CommandName} handled - response: {@Response}", request.GetGenericTypeName(), response); return response; } }

 5.添加ValidatorBehavior.cs文件

public class ValidatorBehavior
: IPipelineBehavior
{ private readonly ILogger
> _logger; private readonly IValidator
[] _validators; public ValidatorBehavior(IValidator
[] validators, ILogger
> logger) { _validators = validators; _logger = logger; } public async Task
Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate
next) { var typeName = request.GetGenericTypeName(); _logger.LogInformation("----- Validating command {CommandType}", typeName); var failures = _validators .Select(v => v.Validate(request)) .SelectMany(result => result.Errors) .Where(error => error != null) .ToList(); if (failures.Any()) { _logger.LogWarning("Validation errors - {CommandType} - Command: {@Command} - Errors: {@ValidationErrors}", typeName, request, failures); throw new OrderingDomainException( $"Command Validation Errors for type {typeof(TRequest).Name}", new ValidationException("Validation exception", failures)); } return await next(); } }

  6.添加CreateOrderCommandValidator.cs

public class CreateOrderCommandValidator : AbstractValidator
{ public CreateOrderCommandValidator() { RuleFor(command => command.City).NotEmpty(); RuleFor(command => command.Street).NotEmpty(); RuleFor(command => command.State).NotEmpty(); RuleFor(command => command.Country).NotEmpty(); RuleFor(command => command.ZipCode).NotEmpty(); RuleFor(command => command.CardNumber).NotEmpty().Length(12, 19); RuleFor(command => command.CardHolderName).NotEmpty(); RuleFor(command => command.CardExpiration).NotEmpty().Must(BeValidExpirationDate).WithMessage("Please specify a valid card expiration date"); RuleFor(command => command.CardSecurityNumber).NotEmpty().Length(3); RuleFor(command => command.CardTypeId).NotEmpty(); RuleFor(command => command.OrderItems).Must(ContainOrderItems).WithMessage("No order items found"); } private bool BeValidExpirationDate(DateTime dateTime) { return dateTime >= DateTime.UtcNow; } private bool ContainOrderItems(IEnumerable
orderItems) { return orderItems.Any(); } }

 

转载于:https://www.cnblogs.com/guoyiwen/p/10484468.html

你可能感兴趣的文章
阶段3 2.Spring_02.程序间耦合_5 编写工厂类和配置文件
查看>>
阶段3 2.Spring_01.Spring框架简介_05.spring的优势
查看>>
阶段3 2.Spring_02.程序间耦合_7 分析工厂模式中的问题并改造
查看>>
阶段3 2.Spring_02.程序间耦合_4 曾经代码中的问题分析
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_4 ApplicationContext的三个实现类
查看>>
阶段3 2.Spring_02.程序间耦合_8 工厂模式解耦的升级版
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_6 spring中bean的细节之三种创建Bean对象的方式
查看>>
阶段3 2.Spring_04.Spring的常用注解_3 用于创建的Component注解
查看>>
阶段3 2.Spring_04.Spring的常用注解_2 常用IOC注解按照作用分类
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_5 JdbcTemplate在spring的ioc中使用
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_02.ssm整合之搭建环境
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_3、快速创建SpringBoot应用之手工创建web应用...
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_04.ssm整合之编写SpringMVC框架
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_5、SpringBoot2.x的依赖默认Maven版本...
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_08.ssm整合之Spring整合MyBatis框架
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_9、SpringBoot基础HTTP其他提交方法请求实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_12、SpringBoot2.x文件上传实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_19、SpringBoot个性化启动banner设置debug日志...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_20、SpringBoot2.x配置全局异常实战...
查看>>