using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
public static void Main()
using IHost host = Host.CreateDefaultBuilder()
.ConfigureServices((_, services) =>
services.AddScoped<IEventHandler, Chain>();
services.AddSingleton<App>();
using var scope = host.Services.CreateScope();
var services = scope.ServiceProvider;
services.GetRequiredService<App>().Run();
private readonly IEventHandler chain;
public App(IEventHandler chain)
public class Chain : IEventHandler
public void HandleEvent()
var firstStep = new StepA();
public class StepA : StepBase
public override void HandleEvent()
Console.WriteLine("Step A");
public class StepB : StepBase
public override void HandleEvent()
Console.WriteLine("Step B");
public class StepC : StepBase
public override void HandleEvent()
Console.WriteLine("Step C");
public abstract class StepBase : IEventHandler
protected IEventHandler Next { get; private set; }
public abstract void HandleEvent();
public StepBase SetNext(StepBase nextNode)
public interface IEventHandler