NetCore Program.cs 基础操作

Posted microsoft-zhcn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NetCore Program.cs 基础操作相关的知识,希望对你有一定的参考价值。

获取配置文件:

string connection = builder.Configuration.GetConnectionString("DefaultConnection");

 注入DbContext配置示例:

builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

 

依赖注入:

// Singleton 单例,该实例在需要它的所有组件之间共享。因此始终使用同一实例。
builder.Services.AddSingleton<Isite, site>();

// Scoped 范围,在对应用程序的每个请求上都会创建一个范围,因此每个请求将创建一次注册为Scoped的任何组件。
builder.Services.AddScoped<Isite, site>();

//Transient 短暂,在每次被请求时都会创建,并且永不共享。
builder.Services.AddTransient<Isite, site>();

 

在program.cs中访问DB Context

有没有办法在program.cs文件中访问.NET Core应用程序的数据库上下文?我基本上希望使用存储在数据库中的特定选项配置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);
                    });
                });
答案

诀窍是如何在单例中创建范围服务:


    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
                }
            });
    }
另一答案

尝试执行以下操作:

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();
另一答案

我想出了如何去做这件事。您需要手动构建DB上下文的配置,然后实例化上下文,然后您就可以使用它。这是代码,以防任何人处于这个位置。

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();
                    });
                });
另一答案

是的,您可以使用以下代码获得服务

 var host = BuildWebHost(args);

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

和在startup.cs中注册DbContext的代码如下

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

以上是关于NetCore Program.cs 基础操作的主要内容,如果未能解决你的问题,请参考以下文章

asp.net core中的Host和WebHost类有啥区别

ASP.NETCore 3.0 Autofac替换及控制器属性注入及全局容器使用

.NET Core 当前版本

WPF从program.cs启动项目时报错

如何在 .net6 中使用 WebApplicationFactory(没有可说的入口点)

无法解析 JSON 文件,Progam.cs asp.net 核心中的错误