下载依赖包
dotnet add package MediatR
dotnet add package MediatR.Extensions.Microsoft.DependencyInjection
dotnet add package Autofac
dotnet add package Autofac.Extensions.DependencyInjection
在Program或者Startup中用autofac替换原生的DI
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
注册MediatR
using Autofac;
using MediatR.Extensions.Autofac.DependencyInjection;
using MediatR.Extensions.Autofac.DependencyInjection.Builder;
public class MediatorModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
var assemblies = new[]
{
Assembly.GetExecutingAssembly(),
typeof(TransferCommandHandler).Assembly
};
// Step 2: Configure MediatR with Autofac
var mediatRConfig = MediatRConfigurationBuilder.Create(assemblies)
.WithAllOpenGenericHandlerTypesRegistered()
.WithRegistrationScope(RegistrationScope.Scoped) // Optional: Scoped/Transient/Singleton
.Build();
// Step 3: Register MediatR with Autofac
builder.RegisterMediatR(mediatRConfig);
}
}
注册到Autofac
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
containerBuilder.RegisterModule(new AutofacMediatRModule());
});
添加MediatR的处理事件
public class TestCommandQuery : IRequest<string>
{}
public class TestCommandHandler: IRequestHandler<TestCommandQuery, string>
{
public async Task<string> Handle(TestCommandQueryrequest, CancellationToken cancellationToken)
{
await Task.CompletedTask;
return "Test";
}
使用Mediat处理消息
public class TestController : Controller
{
private readonly IMediator _mediator;
public TestController(IMediator mediator)
{
_mediator = mediator;
}
public async Task<IActionResult> GetTest()
{
var request = new TestCommandQuery();
var res = await _mediator.Send(request);
return OK(res);
}
}