Вы должны быть в состоянии заменить:
отсюда:
dataProviderSettings.DataConnectionString
builder.Register<IDbContext>(c => new DBObjectContext(dataProviderSettings.DataConnectionString)).InstancePerLifetimeScope();
с классом, который будет читать значение из куки.
Этот новый класс, очевидно, не будет контроллером, поэтому доступ к HttpContext
должен быть достигнут с помощью: IHttpContextAccessor
.
Для этого добавьте следующее:
public void ConfigureServices(IServiceCollection services)
{
//other registrations
services.AddHttpContextAccessor();
}
Тогда в вашем новом классе:
public class ConnectionStringAccessor {
private IHttpContextAccessor _httpContextAccessor;
public ConnectionStringAccessor(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public string GetConnectionString() {
return _httpContextAccessor.HttpContext.Request.Cookies["cookieName"].Value;
//you can consider some encryption/decryption or whatever you need to.
}
}
и, наконец,
builder.Register<IDbContext>(c => new DBObjectContext(c.Resolve<ConnectionStringAccessor >().GetConnecionString()).InstancePerLifetimeScope();
В данный момент VisualStudio недоступен, поэтому я поместил код без сборки или тестирования. Кроме того, ваш новый класс должен быть зарегистрирован в DI.
Для получения дополнительной информации, пожалуйста, обратитесь к этой статье: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-2.2
Просто чтобы подчеркнуть, как я уже сказал в комментарии, такой способ работы с такими разумными вещами, как строка подключения, крайне небезопасен.