选项 <T> 未在 DI 中填充

Options<T> not populating in DI

我正在为我的依赖项使用 .Net Core 2.1 和聚合/门面模式(我很乐意在其他地方使用 Ninject / .net 4.6)。但是当我尝试通过选项时,我得到一个空值(调试我可以看到那里被拾取)但没有传递给 Autofac(我很确定它是我的,因为当我尝试 Ninject 时它们不是).

我做了一个简单的测试项目(新的 .net 核心 Web 应用程序/2.1),然后添加了最少量的代码来复制

Startup.cs

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });
        services.Configure<ApiEndpointsConfiguration>(Configuration);
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        // Create the container builder.
        var builder = new ContainerBuilder();

        builder.Populate(services);
        builder.RegisterAggregateService<IViewModelProvider>();

        var assemblies = AppDomain.CurrentDomain.GetAssemblies()
                            .Where(x => x.FullName.StartsWith("TEST")).ToArray();

        builder.RegisterAssemblyTypes(assemblies)
             .Where(t => t.IsClass)
             .AsImplementedInterfaces()
             .InstancePerLifetimeScope();

        builder.RegisterAggregateService<IDomainServiceProvider>();
        ApplicationContainer = builder.Build();

        var chkOptions = ApplicationContainer.Resolve<IOptions<ApiEndpointsConfiguration>>();


        // Create the IServiceProvider based on the container.
        return new AutofacServiceProvider(ApplicationContainer);
    }

Program.cs

    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureServices(services => services.AddAutofac())
            .UseStartup<Startup>();
    }

IViewModelProvider.cs

public interface IViewModelProvider
{
    IProgrammeViewModelBuilder ProgrammeViewModel { get; }
}

IProgrammeViewModelBuilder.cs

public interface IProgrammeViewModelBuilder
{
    ProgrammeViewModel GetProgrammeViewModel();
}

我最初的问题是在我的服务中,控制器调用注入的 viewmodelbuilder

var viewModel = _viewModels.ProgrammeViewModel.GetProgrammeViewModel();

这又会调用服务 -

    readonly IOptions<ApiEndpointsConfiguration> _apiSettings;

    public ProgrammeService(IOptions<ApiEndpointsConfiguration> apiSettings) : base (new Uri(apiSettings.Value.BaseAddress))
    {
        _apiSettings = apiSettings;
    }

但那时(构造函数触发)服务配置项为空,所以我已经逐步完成,我可以看到服务具有 "ApiEndpointsConfiguration" 的值,但是当它们被传递到"builder" 值为空

ApplicationContainer.Resolve<IOptions<ApiEndpointsConfiguration>>(); 

内部值显示为空。

不确定我做错了什么?

:(真的,这就是答案如此简单的时候,谢谢它看起来。感谢任何发现它的人;

services.Configure<ApiEndpointsConfiguration>(Configuration.GetSection("ApiEndpointsConfiguration"));

而不是

services.Configure<ApiEndpointsConfiguration>(Configuration);

所以基本上当我认为我可以看到它调试时我看到的是原始 JSON 提供的值而不是 "configured service"。我会把它留在这里作为我自己的一个教训,先检查简单的事情。

第一次尝试时,我不确定 "registered" 实际是什么。