选项 <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" 实际是什么。
我正在为我的依赖项使用 .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" 实际是什么。