Ранее я обнаружил MediatoR, он меня впечатлил, и мне интересно, как добавить его в очень простое консольное приложение C#.
Один хакерский и несовершенный способ сделать это — сослаться на пакет Microsoft.Extensions.DependencyInjection
в проекте вашего приложения CLI, а затем создать новый ServiceCollection
, после чего вы можете просто добавить посредник и все другие сервисы, которые могут вам понадобиться.
var services = new ServiceCollection();
services.AddMediatR(/* config */);
// Dependency injection will not work perfectly, but inside of your classes, you could reference the IServiceProvider, instead of the services themself.
// For example:
class Dependency(IServiceProvider sp)
{
private IMediator mediator => sp.GetRequiredService<IMediator>;
public async Task Do(CancellationToken ct = default)
{
var request = new SomeRequest();
var resp = await mediator.Send(request, ct);
// do something with this.
}
}
Вы можете увидеть, как я использую это для бота Discord в своем проекте здесь
Я реализовал MediatoR, как показано в коде ниже. Я все написал в Program.cs, однако вы определенно можете создавать отдельные классы.
using System;
using System.Diagnostics;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using MediatR;
using Microsoft.Extensions.DependencyInjection;
namespace ConsoleApp1
{
class Program
{
static async Task Main(string[] args)
{
var services = new ServiceCollection();
ConfigureService(services);
var serviceProvider = services.BuildServiceProvider();
// Get MediatR instance
var mediator = serviceProvider.GetRequiredService<IMediator>();
var response = await mediator.Send(new Ping());
for (int i = 0; i < response.Length; i++)
{
Debug.WriteLine(response[i]);
}
}
public static void ConfigureService(IServiceCollection services)
{
var mediator = services.AddMediatR(cfg => {
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly);
});
}
}
public class Ping : IRequest<string[]>
{
}
public class PingHandler : IRequestHandler<Ping, string[]>
{
public Task<string[]> Handle(Ping request, CancellationToken cancellationToken)
{
string[] cars = { "Volvo", "BMW", "Ford", "Mazda" };
return Task.FromResult(cars);
}
}
}
dotnet add package MediatR