Как получить строку подключения в функции 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")));
}
Другие вопросы по тегам