【问题标题】:Configuring services for ASP.NET core and .NET core CLT为 ASP.NET 核心和 .NET 核心 CLT 配置服务
【发布时间】:2020-09-08 15:46:46
【问题描述】:

我想使用相同的代码和配置来为 ASP.NET 核心和 .net 核心命令行工具设置 DI。

我了解如何使用 Startup.cs 为 ASP.NET 核心配置服务。我了解如何在命令行工具中构建ServiceCollection,尽管除了显式访问它之外,我不确定如何使用它,而且我认为我的 CLT 必须自己管理服务集合(不像 ASP.NET提供服务集合和构造函数注入)。

我的 Web 和 CLT 项目可以使用相同的扩展方法来注册我的服务吗? Startup.ConfigureServices 会将ServiceCollection 和它收到的配置传递给我的扩展方法。 CLT 我可以传递 CLT 管理的ServiceCollection,但它可以从appsettings.json 文件中获取相同类型的配置吗?

【问题讨论】:

标签: c# asp.net .net asp.net-core dependency-injection


【解决方案1】:

在 CLT 中我需要一些掘金:

Microsoft.Extensions.Cofiguration.Json
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Hosting

private static ServiceCollection _services = new ServiceCollection();

    public static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
//TODO:                .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
        builder.Build();
        IConfigurationBuilder configBuilder =
            new ConfigurationBuilder().AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
        ServiceProvider provider = ConfigureServices(_services, configBuilder.Build()).BuildServiceProvider(); //TODO: dispose
        _repo = provider.GetService<IRepository>();
        provider.Dispose();

我可能会将 CLT 的属性设置为提供程序,但我不确定如何确保它被释放。

【讨论】:

  • 这绝对是使用与应用类型无关的配置 API 的正确方法,就像您在此处所做的那样。关于处置: 1:不要手动调用处置,不是异常安全的;使用using, 2:您的应用程序的逻辑生命周期完全在 main 方法中。因此,使用字段是没有意义的,并且会混淆额外的代码。删除该字段并写入using var provider = new ConfigureServices(new ServiceCollection(), configBuilder.Build()).BuildServiceProvider();
猜你喜欢
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
相关资源
最近更新 更多