Многоликая регистрация в стандартном контейнере



Допустим, у нас есть некоторый класс, который реализует более одного интерфейса:



public interface IBar {}

public interface IFoo {}



public class FooBar : IFoo, IBar {}






Наша задача зарегистировать экземпляр FooBar таким образом, чтобы при внедрении зависимостей IBar и IFoo использовался один и тот же объект.



Попытавшись совершить регистрацию наивным путём, мы потерпим неудачу, зависимости будут ссылаться на разные экземпляры FooBar:



services.AddSingleton<IFoo, FooBar>();

services.AddSingleton<IBar, FooBar>();






Но проблема вполне решаема, достаточно лишь зарегистрировать вначале экземпляр FooBar и затем ссылаться на него:



services.AddSingleton<FooBar>();

services.AddSingleton<IFoo>(x => x.GetRequiredService<FooBar>());

services.AddSingleton<IBar>(x => x.GetRequiredService<FooBar>());