选项<t>未在DI中填充

时间:2018-07-18 11:14:43

标签: asp.net-core dependency-injection autofac aggregateroot

我正在使用.Net Core 2.1和一个Aggregate / Facade模式作为我的依赖项(我很高兴在其他地方使用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;
    }

但是在那一刻(构造函数触发),服务配置项为null,因此我单步执行,我可以看到服务具有“ ApiEndpointsConfiguration”的值,但当它们传递给“ builder”时值为空

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

显示内部值的null。

不确定我在做什么错吗?

1 个答案:

答案 0 :(得分:0)

:(确实是这样,答案看起来要简单得多。感谢发现它的任何人;

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

而不是

services.Configure<ApiEndpointsConfiguration>(Configuration);

因此,从本质上讲,我以为可以调试它,而我看到的是原始JSON提供的值,而不是“配置的服务”。我将把这里留给我自己作为一个教训,首先检查一下简单的事情。

不确定我最初尝试的是什么“注册”。