Доступ к контексту БД в program.cs - PullRequest
1 голос
/ 07 марта 2019

Есть ли способ доступа к контексту БД приложения .NET Core в файле program.cs?Я просто пытаюсь настроить Kestrel с определенными параметрами, которые хранятся в базе данных, поэтому мне нужен доступ к контексту базы данных.

Я пытаюсь сделать что-то вроде этого:

WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseSentry()
            .UseKestrel(opts =>
                 {
                    opts.Listen(IPAddress.Any, 443, listenOptions =>
                    {
                        var storedCert = _db.Certificates.First(c => c.Id == 1);
                        var certBytes = Convert.FromBase64String(storedCert.CertificatePfx);
                        var certPassword = storedCert.CertificatePassword;

                        var cert = new X509Certificate2(certBytes, certPassword);

                        listenOptions.UseHttps(cert);
                    });
                });

Ответы [ 4 ]

1 голос
/ 07 марта 2019

Хитрость в том, как создать сервис с определенной областью в пределах одного сета:


    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

   public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseKestrel(opt => {
                var sp = opt.ApplicationServices;
                using(var scope = sp.CreateScope() ){
                    var dbContext=scope.ServiceProvider.GetService<AppDbContext>();
                    var e= dbContext.Certificates.FirstOrDefault();
                    // now you get the certificates
                }
            });
    }
0 голосов
/ 07 марта 2019

Попробуйте сделать следующее:

var host = CreateWebHostBuilder(args).Build();

var scope = host.Services.CreateScope();

var ctx = scope.ServiceProvider.GetRequiredService<MyDbContext>();       

//get a new WebHostBuilder
CreateWebHostBuilder(args)
//Configure here using the ctx
.Build()
.Run();
0 голосов
/ 07 марта 2019

Я понял, как это сделать.Вам необходимо вручную создать конфигурацию для контекста БД, затем создать экземпляр контекста, после чего вы сможете использовать его.Вот код на случай, если кто-нибудь окажется в этой позиции.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseSentry()
                .UseKestrel(opts =>
                {
                    opts.Listen(IPAddress.Any, 443, listenOpts =>
                    {
                        //Create the configuration to read from appsettings.json
                        var configuration = new ConfigurationBuilder().AddJsonFile(
                                Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "appsettings.json"))
                            .Build();

                        //Create the DB Context options
                        var optionsBuilder = new DbContextOptionsBuilder<DBContext>()
                            .UseSqlServer(configuration["ConnectionString:Development"]);

                        //Create a new database context
                        var context = new DBContext(optionsBuilder.Options);

                        //Get the certificate
                        var certificate = context.Certificates.First();
                    });
                });
0 голосов
/ 07 марта 2019

Да, вы можете получить услугу, используя следующий код

 var host = BuildWebHost(args);

DbContext context = host.Services.GetService<DbContext>();

и код для регистрации вашего DbContext в startup.cs выглядит следующим образом

services.AddDbContext<DbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
...