Продолжаю экспериментировать с DI
Допустим, у нас есть некий сервис
Внезапно возникла потребность "задекорировать" его некоторым
Ну всякое бывает, правда ведь?)
Когда под рукой только стандартный DI контейнер .NET, то на ум приходит следующее:
Естественно, это не заработает, программа зависнет на веки вечные.
Однако, проблема решаема с помощью библиотеки Scrutor.
Она добавляет методы расширения для
Допустим, у нас есть некий сервис
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>();