Skip to content

Instantly share code, notes, and snippets.

@n-j-m
Created January 12, 2025 21:04
Show Gist options
  • Select an option

  • Save n-j-m/5e87d57b16b7c41ca15395beb862b38a to your computer and use it in GitHub Desktop.

Select an option

Save n-j-m/5e87d57b16b7c41ca15395beb862b38a to your computer and use it in GitHub Desktop.

Revisions

  1. n-j-m created this gist Jan 12, 2025.
    9 changes: 9 additions & 0 deletions Entity1.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,9 @@
    using MediatR;
    using TypeConst.Cli.Interfaces;

    namespace TypeConst.Cli.Models;

    public class Entity1 : IName, IRequest
    {
    public string Name { get; set; } = default!;
    }
    13 changes: 13 additions & 0 deletions Entity1Handler.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,13 @@
    using MediatR;
    using TypeConst.Cli.Interfaces;
    using TypeConst.Cli.Models;

    namespace TypeConst.Cli.Handlers;

    public class Entity1Handler(IServiceWorker<Entity1> worker) : IRequestHandler<Entity1>
    {
    public async Task Handle(Entity1 request, CancellationToken cancellationToken)
    {
    await worker.DoWorkAsync(request, cancellationToken);
    }
    }
    13 changes: 13 additions & 0 deletions Entity1ServiceWorker.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,13 @@
    using TypeConst.Cli.Interfaces;
    using TypeConst.Cli.Models;

    namespace TypeConst.Cli.Services;

    public class Entity1ServiceWorker : IServiceWorker<Entity1>
    {
    public async Task DoWorkAsync(Entity1 entity, CancellationToken cancellationToken = default)
    {
    Console.WriteLine("Entity1: {0}", entity.Name);
    await Task.Delay(1000, cancellationToken);
    }
    }
    9 changes: 9 additions & 0 deletions Entity2.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,9 @@
    using MediatR;
    using TypeConst.Cli.Interfaces;

    namespace TypeConst.Cli.Models;

    public class Entity2 : IName, IRequest
    {
    public string Name { get; set; } = default!;
    }
    13 changes: 13 additions & 0 deletions Entity2Handler.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,13 @@
    using MediatR;
    using TypeConst.Cli.Interfaces;
    using TypeConst.Cli.Models;

    namespace TypeConst.Cli.Handlers;

    public class Entity2Handler(IServiceWorker<Entity2> worker) : IRequestHandler<Entity2>
    {
    public async Task Handle(Entity2 request, CancellationToken cancellationToken)
    {
    await worker.DoWorkAsync(request, cancellationToken);
    }
    }
    13 changes: 13 additions & 0 deletions Entity2ServiceWorker.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,13 @@
    using TypeConst.Cli.Interfaces;
    using TypeConst.Cli.Models;

    namespace TypeConst.Cli.Services;

    public class Entity2ServiceWorker : IServiceWorker<Entity2>
    {
    public async Task DoWorkAsync(Entity2 entity, CancellationToken cancellationToken = default)
    {
    Console.WriteLine("Entity2: {0}", entity.Name);
    await Task.Delay(2000, cancellationToken);
    }
    }
    6 changes: 6 additions & 0 deletions IName.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,6 @@
    namespace TypeConst.Cli.Interfaces;

    public interface IName
    {
    string Name { get; set; }
    }
    6 changes: 6 additions & 0 deletions IServiceWorker.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,6 @@
    namespace TypeConst.Cli.Interfaces;

    public interface IServiceWorker<TEntity> where TEntity : IName
    {
    Task DoWorkAsync(TEntity entity, CancellationToken cancellationToken = default);
    }
    29 changes: 29 additions & 0 deletions Program.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,29 @@
    // See https://aka.ms/new-console-template for more information
    using MediatR;
    using Microsoft.Extensions.DependencyInjection;
    using TypeConst.Cli.Interfaces;
    using TypeConst.Cli.Models;
    using TypeConst.Cli.Services;

    Console.WriteLine("Hello, World!");

    var services = new ServiceCollection()
    .AddSingleton<IServiceWorker<Entity1>>(_ => new Entity1ServiceWorker())
    .AddSingleton<IServiceWorker<Entity2>>(_ => new Entity2ServiceWorker());

    services.AddMediatR(c => c.RegisterServicesFromAssembly(typeof(Program).Assembly));


    using var provider = services.BuildServiceProvider();

    List<IName> names = [
    new Entity1 { Name = "Entity 1" },
    new Entity2 { Name = "Entity 2" },
    ];

    var mediator = provider.GetRequiredService<IMediator>();

    foreach (var name in names)
    {
    await mediator.Send(name);
    }