У меня есть проект с точкой входа ASP. NET Core API и инфраструктурный проект, который является клиентом для MongoDB. У меня проблема, я бы вставил свой интерфейс IDatabaseSettings (то есть в общий проект) в проект с клиентом mon go, поэтому я создаю конкретный тип в моем основном проекте, например:
public class MongoSettings : IDatabaseSettings
{
private const string Mongo = "Mongo";
private static IConfiguration _configuration;
public LogMongoSettings(IConfiguration configuration)
{
_configuration = configuration;
}
public string ConnectionString { get; } = _configuration.GetValue<string>($"{Mongo}:ConnectionString");
public string DatabaseName { get; } = _configuration.GetValue<string>($"{Mongo}:Database");
public string Username { get; } = _configuration.GetValue<string>($"{Mongo}:Username") ?? string.Empty;
public string Password { get; } = _configuration.GetValue<string>($"{Mongo}:Password") ?? string.Empty;
}
проблема в том, что _configuration всегда пуста, и этот код вызывает исключение. Я использую контейнер SimpleInjector, и мой проект запуска выглядит следующим образом:
public class Startup
{
private static readonly Container Container = new Container();
private static readonly Assembly LogReaderAssembly = Assembly.Load("LogReader.IdP");
private static readonly Assembly MongoLogReaderAssembly = Assembly.Load("LogReader.Mongo");
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSimpleInjector(Container, options =>
{
options.AddAspNetCore()
.AddControllerActivation();
options.AddLogging();
});
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("LogReader", new OpenApiInfo
{
Version = "V1"
});
});
InitializeContainer();
}
private static void InitializeContainer()
{
Container.RegisterSingleton<IDatabaseClient, DatabaseClient>();
Container.Register<IFileRepositoryReader, TraceFileRepositoryReader>();
Container.Register(typeof(IRepositoryReader<>), MongoLogReaderAssembly);
Container.RegisterSingleton(() => Container.GetInstance<MapperProvider>().GetMapper());
Container.Register(typeof(IQueryHandler<,>), LogReaderAssembly);
Container.Register<IDatabaseSettings, MongoSettings>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseSimpleInjector(Container);
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.UseSwagger();
Container.Verify(VerificationOption.VerifyAndDiagnose);
}
}
Почему это происходит? В чем проблема? Я бы не использовал IOptionMonitor в моем клиенте Mon go, потому что не хотел бы, чтобы этот класс зависел от конкретных TOptions. Есть ли лучшее решение проблемы? Спасибо.