Как зарегестрировать реализацию для нескольких интерфейсов в ASP.NET?

Я создал сервис, реализующий несколько интерфейсов, и пытаюсь зарегистрировать его на DI в ASP.Net Core. В моём случае, я хочу чтобы сервис был Singleton, и при запросе любого из реализуемых интерфейсов, потребитель получал один и тот-же экземпляр.
Проще говоря, я хочу что-то вроде

class Impl: IService1, IService2 { }
...
services.AddSingleton<IService1, IService2, Impl>();
...
public SomeController(IService1 service1, IService2 service2)
{
    service1 == service2 // true, потому что это один и тот-же экземпляр
}

Как это можно сделать?


Ответы (1 шт):

Автор решения: bearpro

Вы можете зарегистрировать саму реализацию как сервис (с тем типом, который имеет сама реализация), и использовать этот сервис для получения реализаций отдельных интерфейсов.
Буквально, вот так:

services.AddSingleton<Impl>();
services.AddSingleton<IService1>(services => services.GetService<Impl>());
services.AddSingleton<IService2>(services => services.GetService<Impl>());

Это также должно сработать для Scoped-сервисов.

→ Ссылка