• 创建支持依赖注入、Serilog 日志和 AppSettings 的 .NET 5 控制台应用


    翻译自 Mohamad Lawand 2021年3月24日的文章 《.NET 5 Console App with Dependency Injection, Serilog Logging, and AppSettings》 [1]

    在本文中,我们将构建一个 .NET 5 控制台应用程序,该应用程序支持依赖注入、日志记录和 appsettings 配置。

    你也可以在 YouTube 上观看完整的视频[2],还可以在 GitHub 上下载源代码[3]

    .NET 5 Console App with Dependency Injection, Serilog Logging, and AppSettings

    我们要用到的开发工具有:

    我们要实现的功能包含:

    • 依赖注入
    • Serilog Logger
    • AppSettings

    我们将构建一个示例应用程序,该应用程序将模拟通过依赖注入连接数据库,并输出日志。

    首先,我们在终端中创建应用程序:

    dotnet new console -n "SampleApp"
    

    创建好应用程序后,在 Visual Studio Code 中打开应用程序,然后构建并运行一下,以确保一切正常:

    dotnet build
    dotnet run
    

    接下来是安装我们所需的程序包:

    dotnet add package Microsoft.Extensions.Hosting
    dotnet add package Serilog.Extensions.Hosting
    dotnet add package Serilog.Settings.Configuration 
    dotnet add package Serilog.Sinks.Console
    

    下一步是添加 appsettings.json,在应用程序的根目录中右键单击并选择 New File,将文件名称设置为 appsettings.json

    我们将在 appsettings 中添加所需的配置项——Serilog,以及用于模拟数据库连接的 ConnectionStrings:

    {
        "Serilog": {
            "MinimalLevel": {
                "Default": "Information",
                "Override": {
                    "System": "Warning",
                    "Microsoft": "Information"
                }
            }
        },
        "ConnectionStrings": {
            "DefaultConnection": "DataSource:app.db;Cache=Shared"
        }
    }
    

    我们从实现日志记录的机制开始讲起。

    Program.cs 中添加以下代码,该段代码的职责是读取 appsetting.json 并将其提供给我们的应用程序:

    // 检查应用程序运行的当前目录,找到并加载 'appsetting.json',
    // 然后添加环境变量,这些环境变量会覆盖 appsettings.json 中的配置 
    static void BuildConfig(IConfigurationBuilder builder)
    {
        builder.SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
    }
    

    然后,我们需要创建另一个方法,该方法是我们应用程序的启动方法,它负责将所有的内容汇集在一起。我们将定义 Serilog 和 .NET Core 中的依赖注入机制。

    // Program.cs
    
    static IHost AppStartup()
    {
        var builder = new ConfigurationBuilder();
        BuildConfig(builder);
    
        // 定义 Serilog 配置
        Log.Logger = new LoggerConfiguration()  //初始化 Logger 配置
            .ReadFrom.Configuration(builder.Build()) //将 Serilog 连接到我们的配置
            .Enrich.FromLogContext() //从装入的 Serilog 向日志添加更多信息
            .WriteTo.Console() //决定在哪里显示日志
            .CreateLogger(); //初始化 Logger
    
        Log.Logger.Information("Application Starting");
    
        // 初始化依赖注入容器
        var host = Host.CreateDefaultBuilder() //初始化 Host 
                    .ConfigureServices((context, services) => //向容器添加服务
                    {
                        
                    })
                    .UseSerilog() //添加 Serilog
                    .Build(); //构建 Host
    
        return host;
    }
    

    现在,让我们实现数据服务,用它来模拟数据库。

    让我们创建一个名为 DataService 的新类和一个名为 IDataService 的接口:

    // IDataService.cs
    // 接口
    public interface IDataService
    {
        void Connect();
    }
    
    // DataService.cs
    // 类
    public class DataService : IDataService
    {
        private readonly ILogger<DataService> _log;
        private readonly IConfiguration _config;
    
        public DataService(ILogger<DataService> log, IConfiguration config)
        {
            _log = log;
            _config = config;
        }
    
        public void Connect()
        {
            // 读取连接字符串
            var connString = _config.GetValue<string>("ConnectionStrings:DefaultConnection");
    
            _log.LogInformation("Connection String {cs}", connString);
        }
    }
    

    然后我们需要更新 Program.cs 类中的 AppStartup 方法以注入 DataService

    var host = Host.CreateDefaultBuilder() //初始化 Host 
                .ConfigureServices((context, services) => //向容器添加服务
                {
                    services.AddTransient<IDataService, DataService>(); //AddTransient 意味着每次请求都会创建一个实例。
                })
                .UseSerilog() //添加 Serilog
                .Build(); //构建 Host
    

    最后,让我们在 Main 方法中调用他们:

    // Program.cs
    
    static void Main(string[] args)
    {
        var host = AppStartup();
    
        var dataService = ActivatorUtilities.CreateInstance<DataService>(host.Services);
    
        dataService.Connect();
    }
    

    好了,就是这样。

    感谢您的阅读。


    作者 : Mohamad Lawand
    译者 : 技术译民
    出品 : 技术译站
    链接 : 英文原文


    1. https://dev.to/moe23/net-5-console-app-with-dependency-injection-serilog-logging-and-appsettings-3d4n .NET 5 Console App with Dependency Injection, Serilog Logging, and AppSettings ↩︎

    2. https://youtu.be/4mEN1XpLN_s ↩︎

    3. https://github.com/mohamadlawand087/v22-DotnetConsole ↩︎

    © 转载请标明出处   https://www.cnblogs.com/ittranslator

    不做标题党,只分享技术干货

    公众号『技术译站』,欢迎扫码关注

  • 相关阅读:
    8-kubernetes-安全
    6-kubernetes网络
    5-kunernetes资源调度
    4-K8S 部署Java应用及应用程序生命周期管理
    3-kubernetes监控与日志管理
    2-K8S常用命令
    1-kubeadm部署1.18.0单master集群
    部署Prometheus+Grafana监控
    微信小程序学习
    vue 中使用 @scroll事件 没有用
  • 原文地址:https://www.cnblogs.com/ittranslator/p/net-5-console-app-with-dependency-injection-serilog-logging-and-appsettings.html
Copyright © 2020-2023  润新知