Skip to content

Instantly share code, notes, and snippets.

View andriysavin's full-sized avatar

Andriy Savin andriysavin

View GitHub Profile
services.AddDecorator<IEmailMessageSender, EmailMessageSenderWithRetryDecorator>(
decorateeServices =>
{
decorateeServices.AddDecorator<IEmailMessageSender, SecondEmailSenderDecorator>(
decorateeServices2 =>
decorateeServices2.AddScoped<IEmailMessageSender, SmtpEmailMessageSender>());
});
@andriysavin
andriysavin / DecoratorConfigure.cs
Last active May 28, 2019 12:43
Configure decorator with DI as simple as this
services.AddDecorator<IEmailMessageSender, EmailMessageSenderWithRetryDecorator>(
decorateeServices =>
{
decorateeServices.AddScoped<IEmailMessageSender, SmtpEmailMessageSender>();
});
@andriysavin
andriysavin / DecoratorConfigureAndRun.cs
Last active May 28, 2019 13:40
.Net Core decorator configuration with dependency injection container
var services = new ServiceCollection();
services.AddDecorator<IEmailMessageSender, EmailMessageSenderWithRetryDecorator>(
decorateeServices => decorateeServices.AddScoped<IEmailMessageSender, SmtpEmailMessageSender>());
var serviceProvider = services.BuildServiceProvider();
var emailSender = serviceProvider.GetRequiredService<IEmailMessageSender>();
emailSender.SendMessage(new EmailMessage { Body = "Hello, decorator!" });
new EmailMessageSenderWithRetryDecorator(
innerSender: new SmtpEmailMessageSender(/*dependencies*/)
/*, other dependencies*/);
class EmailMessageSenderWithRetryDecorator : IEmailMessageSender
{
private readonly IEmailMessageSender innerSender;
// Hardcoded for simplicity.
private const int RetryCount = 3;
private const int DelayBetweenRetriesMs = 1000;
public EmailMessageSenderWithRetryDecorator(
IEmailMessageSender innerSender
class SmtpEmailMessageSender : IEmailMessageSender
{
public void SendMessage(EmailMessage message)
{
// Put your real implementation here.
Console.WriteLine(message.Body);
}
}
interface IEmailMessageSender
{
void SendMessage(EmailMessage message);
}
@andriysavin
andriysavin / DecoratorServiceCollectionExtensions.cs
Last active December 5, 2023 23:29
.Net Core Dependency Injection decorator support
using System;
using System.Collections.Generic;
using System.Linq;
namespace Microsoft.Extensions.DependencyInjection
{
public static class DecoratorServiceCollectionExtensions
{
public static void AddDecorator<TService, TDecorator>(
this IServiceCollection serviceCollection,