Как получить строку подключения в функции configureServices в ASP .NET
Я пытаюсь использовать службу идентификации для управления входами в приложение. У меня есть следующее
let configureServices (services : IServiceCollection) =
// Configure InMemory Db for sample application
services.AddDbContext<IdentityDbContext<IdentityUser>>(
fun options ->
options.UseInMemoryDatabase("NameOfDatabase") |> ignore
) |> ignore
Однако он использует базу данных в памяти. Я хочу сохранить информацию о регистрации пользователей, и у меня есть настройка postgresql, и я хочу использовать эту базу данных для сохранения информации. У меня есть информация connectionString в файле settings.json. Я хочу изменить вышеуказанную функцию на это:
let configureServices (services : IServiceCollection) =
// Configure InMemory Db for sample application
services.AddDbContext<IdentityDbContext<IdentityUser>>(
fun options ->
let config = ctx.GetService<IConfiguration>()
let connString = config.Item("connectionString")
options.UseNpgsql(connString) |> ignore
) |> ignore
но проблема в функции configureServices. У меня нет доступа к Httpcontext (представленному ctx выше), который обрабатывает конфигурацию приложения. Как мне это сделать? В основном я хочу получить значение поля connectionString из файла settings.json в моей функции configureServices.
3 ответа
Я предполагаю, что вы используете эту функцию, как показано ниже:
WebHost
.CreateDefaultBuilder(args)
.ConfigureServices(Action<_> configureServices)
.Configure(Action<_> configureApp)
Вы найдете, что есть перегрузка этого ConfigureServices
метод, который принимает Action<WebHostBuilderContext, IServiceCollection>
, Таким образом, вы можете изменить свою функцию следующим образом:
let configureServices (context:WebHostBuilderContext) (services:IServiceCollection) =
let config = context.Configuration
let connString = config.GetConnectionString "DefaultConnection"
services.AddDbContext<IdentityDbContext<IdentityUser>>(fun opts ->
opts.UseNpgsql(connString) |> ignore
) |> ignore
И измените код вызова на это (примечание Action<_>
становится Action<_,_>
):
WebHost
.CreateDefaultBuilder(args)
.ConfigureServices(Action<_,_> configureServices)
.Configure(Action<_> configureApp)
Надеюсь, вы добавили следующую строку кода в ваш файл app.cofig.
<connectionStrings>
<add name="DefaultConnection"
connectionString="Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" />
</connectionStrings>
</configuration>
Который хранил строку подключения к базе данных. В ConfigureServices() U есть доступ к объекту конфигурации, который дает вам доступ к строке подключения вашего приложения из файла app.config.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
Для более подробной информации:- Нажмите здесь
Похоже, вы используете
Startup
класс, в котором вы хотите получить доступ к конфигурации в
ConfigureServices(IServiceCollection services)
метод.
Если вы создали этот класс с нуля, волшебным образом у него не будет объекта. Вам нужно создать конструктор, в который он будет внедрен, а затем где-нибудь сохранить ссылку на него. По умолчанию это делается так :
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
}
Теперь вы можете просто использовать
Configuration
недвижимость, как и ожидалось в вашем
ConfigureServices
и другие методы класса:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContextFactory<IdentityDbContext<IdentityUser>>(options =>
options.UseInMemoryDatabase(
Configuration.GetConnectionString("MyConnectionStringKey")));
}