首页 > 解决方案 > 如何使用控制台应用程序中的通用主机从 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"]));
        });
}

标签: c#entity-framework

解决方案


您已经创建了一个包含您的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如果有兴趣,看看这个


推荐阅读