Продолжаю экспериментировать с DI



Допустим, у нас есть некий сервис IFooService:



interface IFooService

{

void DoStuff();

}




Внезапно возникла потребность "задекорировать" его некоторым FooDecorator.

Ну всякое бывает, правда ведь?)



Когда под рукой только стандартный DI контейнер .NET, то на ум приходит следующее:



// регистрируем основную реализацию

services.AddSingleton<IFooService, FooService>();



// пытаемся задекорировать

services.AddSingleton<IFooService>(sp =>

{

var fooService = sp.GetRequiredService<IFooService>();

return new FooDecorator(fooService);

});




Естественно, это не заработает, программа зависнет на веки вечные.

Однако, проблема решаема с помощью библиотеки Scrutor.



Она добавляет методы расширения для IServiceCollection, которые позволяют эффективно пользоваться всеми преимуществами паттерна "Декоратор":



services.Decorate<IFooService, FooDecorator>();