我正在使用.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。
不确定我在做什么错吗?
答案 0 :(得分:0)
:(确实是这样,答案看起来要简单得多。感谢发现它的任何人;
services.Configure<ApiEndpointsConfiguration>(Configuration.GetSection("ApiEndpointsConfiguration"));
而不是
services.Configure<ApiEndpointsConfiguration>(Configuration);
因此,从本质上讲,我以为可以调试它,而我看到的是原始JSON提供的值,而不是“配置的服务”。我将把这里留给我自己作为一个教训,首先检查一下简单的事情。
不确定我最初尝试的是什么“注册”。