c# - 如何使用控制台应用程序中的通用主机从 appsettings 中获取连接字符串?
问题描述
环境:
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.7" />
SQL Server 2016
.NET 核心 3.1
我有一个console application
下面的工作片段,可以从中获取连接字符串,appsettings
但感觉我有太多代码,我应该能够结合其中的一些,但不确定如何。
class Program
{
static void Main(string[] args)
{
CreateHostBuilder(args);
}
public static void CreateHostBuilder(string[] args)
{
IConfiguration config = new ConfigurationBuilder()
.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "appsettings.json"), true, true)
.Build();
var host = Host.CreateDefaultBuilder(args)
.ConfigureServices((context, services) =>
{
services.AddTransient<App>();
services.AddDbContext<SchoolContext>(options =>
options.UseSqlServer(config["ConnectionStrings:MyDatabase"]));
})
.Build();
ActivatorUtilities.CreateInstance<Startup>(host.Services);
}
}
更新
基于@andy 在下面的回答...
class Program
{
static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
host.RunAsync().GetAwaiter();
ActivatorUtilities.CreateInstance<Startup>(host.Services);
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args).ConfigureServices((context, services) =>
{
var config = context.Configuration; // grab from here
services.AddTransient<App>();
services.AddDbContext<SchoolContext>(options =>
options.UseSqlServer(config["ConnectionStrings:MyDatabase"]));
});
}
解决方案
您已经创建了一个包含您的appsettings.json
文件的默认构建器。你可以通过从上下文中获取它ConfigureServices
class Program
{
static Task Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
return host.RunAsync();
}
/* or you can use a synchronous main:
static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
host.Run();
}
*/
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args).ConfigureServices((context, services) =>
{
var config = context.Configuration; // grab from here
services.AddTransient<App>();
services.AddDbContext<SchoolContext>(options =>
options.UseSqlServer(config["ConnectionStrings:MyDatabase"]));
});
}
我还稍微重构了您的代码,以向您展示使用通用主机的典型创建/构建/运行场景。
预计到达时间
这是一些无耻的自我推销:我想出了一种方法,将这种逻辑转移到我们都知道和喜爱的良好 ol' IWebHostBuilder
/模式中。Startup.cs
如果有兴趣,看看这个。
推荐阅读
- php - 导航选项卡不显示正确的输出
- php - 在具有两个数组的 foreach 循环 php 中的条件存在问题
- java - 如何访问 arrayList 内的类的实例
- ios - 在 iOS 蓝牙设置中使 UWP 应用程序可发现
- python - 如何让 2 个“朋友”比较,看看他们是否在彼此的朋友列表中?
- java - Oracle rdb - 找不到 rdbthin-7.4.3.1-jar。谁能提供下载链接
- javascript - 无法在 Invertase 的 React Native Firebase 中使用 Cloud Firestore 查询分配变量值
- walmart-api - Walmart IO API:未订阅服务名称
- typescript - 打字稿联合类型到单个映射类型
- chromecast - 如何在基于网络的发件人上接收来自 Google Cast Receiver 的消息?