using System.Collections.Generic;
using System.Threading.Tasks;
public static void Main()
Console.WriteLine("Hello World");
public class MessageService
private readonly IEnumerable<IPreProcessor> _preProcessors;
private readonly IEnumerable<IPostProcessor> _postProcessors;
IEnumerable<IPreProcessor> preProcessors,
IEnumerable<IPostProcessor> postProcessors
_preProcessors = preProcessors;
_postProcessors = postProcessors;
public async ResultOrError<SendEmailResponse, SendEmailError> SendEmail(SendEmailRequest request)
var preProcessor = _preProcessors.Single(x => x.Type == request.Type);
var postProcessor = _postProcessors.Single(x => x.Type == request.Type);
if (preProcessor is not null)
var internalRequest = request.ToInternal();
await preProcessor.Run(ref internalRequest);
request = internalRequest.ToExternal();
var response = await Send(request);
if (postProcessor is not null)
var internalResponse = request.ToInternal();
await postProcessor.Run(ref internalResponse);
response = internalResponse.ToExternal();
public interface IPreProcessor
ProcessorType Type { get; }
Task Run(InternalSendEmailRequest request);
public interface IPostProcessor
ProcessorType Type { get; }
Task Run(InternalSendEmailResponse response);
public enum ProcessorType
public static class MessageModule
public static void Load(IServiceCollection services, IConfiguration configuration)
services.AddScoped<IPreProcessor, InsurancePolicyPreProcessor>();
services.AddScoped<IPreProcessor, InsuranceQuotePreProcessor>();
services.AddScoped<IPostProcessor, CustomerCarePostProcessor>();