Можем ли мы разрешить реализацию интерфейса, которая использует другие реализации интерфейса с использованием Lamar в .NET Core 3? - PullRequest
0 голосов
/ 04 ноября 2019

Я использую .NET Core 3.0 и у меня есть следующие классы

public class DataProviderA: IDataProvider { }
public class DataProviderB: IDataProvider { }

public class DataProviderCombined: IDataProvider { 
      public DataProviderCombined(IDataProvider providerA, IDataProvider providerB) { ... }
}

В моем Startup.cs У меня есть службы, зарегистрированные как следующие:

services.AddTransient<IDataProvider, DataProviderCombined>();

services.ForConcreteType<DataProviderCombined>().Configure.Scoped()
        .Ctor<IDataProvider>("providerA").Is<DataProviderA>().Transient()
        .Ctor<IDataProvider>("providerb").Is<DataProviderB>().Transient();

Это, похоже, не решается должным образом, так как я получаю следующие ошибки:

Lamar.IoC.LamarException: Невозможно создать зарегистрированный экземпляр dataProvider из 'IDataProvider': двунаправленные зависимостиобнаружено:

Есть ли в Lamar элемент регистрации, который мне не хватает, чтобы сделать это в .NET Core 3?

1 Ответ

0 голосов
/ 05 ноября 2019

Я неправильно понял сервисы .ForConcreteType <> и как его использовать и не использовал его должным образом.

Итак, с учетом вышесказанного, DataProviderCombined использовался бы в контроллере, но со сквозным внедрением в конструктор с использованием IDataProvider. Это не сработало бы, потому что регистрация выполнялась через реализацию, а не через интерфейс.

В конце концов, было сделано следующее:

services.For<IDataProvider>().Add<DataProviderA>().Named("DA");
services.For<IDataProvider>().Add<DataProviderB>().Named("DB");

services.For<IDataProvider>().Add<CombinedDataProvider>()
            .Ctor<IDataProvider>("daProvider").Is<DataProviderA>()
            .Ctor<IDataProvider>("dbProvider").Is<DataProviderB>()
            .Named("Combined");

services.ForConcreteType<DataController>().Configure
            .Scoped()
            .Ctor<IDataProvider>("combinedDataProvider")
            .IsNamedInstance("Combined");

Это позволило мне использовать комбинированныйПоставщик данных в конструкторе использует следующее:

public class DataController {
   public DataController(IDataProvider combinedDataProvider) { ... }
}
...