0

我正在使用 .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:无法构建“IDataProvider”的已注册实例 dataProvider:检测到双向依赖项:

我在 Lamar 中是否缺少能够在 .NET Core 3 中执行此操作的注册件?

4

1 回答 1

0

我误解了 services.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) { ... }
}
于 2019-11-05T01:04:36.460 回答