创建支持依赖注入、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]

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

  • Visual Studio Code (https://code.visualstudio.com/)

  • .NET Core SDK (https://dotnet.microsoft.com/download)

我们要实现的功能包含:

  • 依赖注入

  • 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 中的依赖注入机制。

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(); //初始化 LoggerLog.Logger.Information("Application Starting");// 初始化依赖注入容器var host = Host.CreateDefaultBuilder() //初始化 Host .ConfigureServices((context, services) => //向容器添加服务{}).UseSerilog() //添加 Serilog.Build(); //构建 Hostreturn host;
}

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

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

// 接口
public interface IDataService
{void Connect();
}// 类
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 方法中调用他们:

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

好了,就是这样。

感谢您的阅读。


相关链接:

  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 ↩︎

作者 :Mohamad Lawand
译者 :技术译民
出品 :技术译站(https://ITTranslator.cn/)

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

作为一个前端,可以如何机智地弄坏一台电脑?

有人说&#xff0c;前端的界限就在浏览器那儿。无论你触发了多少bug&#xff0c;最多导致浏览器崩溃&#xff0c;对系统影响不到哪去。这就像二次元各种炫酷的毁灭世界&#xff0c;都不会导致三次元的世界末日。然而&#xff0c;作为一个前端&#xff0c;我发现是有方式打开次元…

IComparer实现文件名排序

↑↑↑ 点击左上角蓝字关注我&#xff0c;为您提供技术新动态。一、概要本文主要分享在文件对象处理中需要根据文件名排序思路。主要基于.net框架内提供的IComparer对象&#xff0c;它主要将定义类型为比较两个对象而实现的方法。二、详细内容1.场景在读取文件列表的时候&#…

WebService基于SoapHeader实现安全认证[webservice][.net][安全][soapheader]

WebService基于SoapHeader实现安全认证 本文仅提供通过设置SoapHeader来控制非法用户对WebService的调用&#xff0c;如果是WebService建议使用WSE3.0来保护Web服务&#xff0c;如果使用的是Viaual Studio 2008可以使用WCF&#xff0c;WCF里面提供了更多的服务认证方法。以下提…

Java 常见的 30 个误区与细节!

1 在Java中&#xff0c;没有goto语句。因为大量使用goto语句会降低程序的可读性和可维护性&#xff0c;所以Java语言取消了goto的使用。同时&#xff0c;为了避免程序员自行使用goto所带来的混乱&#xff0c;Java语言仍将goto定义为一个关键字&#xff0c;但是没有定义任何语…

信息技术上册教案了解计算机,信息技术上册全册教案

信息技术上册全册教案[课时]:1节课[教学内容]:认识媒体;认识多媒体[教学目标]:1、了解媒体的概念和分类&#xff0c;理解多媒体的内涵和特征。2、能从日常的生活和学习中感受各种媒体及其作用3、培养学生对媒体、多媒体的喜爱&#xff0c;引发他们继续学习的热情。[教学重、难点…

轻量级NuGet—BaGet

1. 介绍BaGet是一个轻量级的包管理服务。有些时候公司或者个人不希望某一些包进行公开&#xff0c;那么就需要使用私有的包管理服务程序&#xff0c;该服务是用.netcore进行编写的(感谢开发者为.NET社区做出的贡献)Github&#xff1a;https://github.com/loic-sharma/BaGet官网…

为什么这个SQL Server DBA学习PowerShell--SQL任务

我开始学习PowerShell&#xff0c;是因为我在寻找一种快速和高效的方式收集有关我的SQL Servers的信息和更好地管理我的服务器工作负载的方式。我以为&#xff0c;我正在学习是另一门新的脚本语言&#xff0c;它能帮我做到前面提到的设想。实际上&#xff0c;我发现学习 PowerS…

30张地图看懂世界格局,用大数据说话

摘要&#xff1a;世界那么大&#xff0c;要了解的数据那么复杂&#xff0c;下面知识探索小编帮您总结一下关于世界的数据。1、 世界人口聚居地红色越深人口密度越大&#xff1b;灰色代表无人地带。2、全球各国平均智商分布图颜色越浅智商越高3、全球冰川融化后的世界地图4、全世…

.NET Core3.1 Dotnetty实战教程

Dotnetty实战系列视频由于在.net的环境当中对dotnetty相关资料相对较少&#xff0c;所以这里主要分享一个dotnetty使用教程希望能帮助到正在使用这套框架的开发者们。虽然这套框架已微软官方已经不在维护&#xff0c;但是这套框架里的设计是相当不错的通过阅读源码能学习到很多…

计算机u打字,win7电脑打字打不出来怎么办

在windows电脑当中&#xff0c;必不可少的一个操作就是打字了&#xff0c;输入代码需要打字&#xff0c;网页中搜索也需要打字&#xff0c;网络聊天也需要打字&#xff0c;不过最近有位win7系统用户&#xff0c;在电脑中打开浏览器&#xff0c;输入想要找的资料的时候&#xff…

我用Python爬取了14年所有的福彩3D信息,彩民们,只能帮你们到这了

作者|丁彦军来源|恋习Python前两天&#xff0c;在网上看到一个有意思的问题&#xff1a;彩票预测靠谱么&#xff1f;为什么还有那么多的人相信彩票预测&#xff1f;暂且不说&#xff0c;彩票预测是否靠谱&#xff1f;彩票预测也分人而异&#xff0c;江湖上骗术很多&#xff0c;…

C#: 8.0 和 9.0 常用新特性

在《带你了解C#每个版本新特性》 一文中介绍了&#xff0c;C# 1.0 到 7.0 的不同特性&#xff0c;本文接着介绍在 8.0 和 9.0 中的一些常用新特性。C# 8.0在 dotNET Core 3.1 及以上版本中就可以使用 C# 8 的语法&#xff0c;下面是 C# 8 中我认为比较常用的一些新功能。默认接…

选股公式 成功率测试 软件,通达信股票软件选股公式,99%的成功率,你还等什么?...

工具&#xff1a;通达信金融终端使用方法&#xff1a;1、通达信软件界面2、点击“功能”“公式系统”“公式管理器”“条件选股公式”“其他类型”&#xff0c;点击新建3、使用选股公式&#xff0c;点击ctrlt&#xff0c;弹出条件选股窗口4、选中公式&#xff0c;点击加入条件&…

小米 华为都要造车?.NET高薪潮来了!(附招聘链接)

近期网络沸沸扬扬的小米、华为、苹果 都要造车&#xff0c;其实百度、阿里和腾讯 也都入局了。互联网大佬们纷纷开始造车&#xff0c;跟我们小小程序员有关系吗&#xff1f;有&#xff01;高薪机会来了&#xff0c;尤其是WPF&#xff01;且听下文分解。物联网终极形态“互联网”…

聚类算法学习指南(二)

http://hi.baidu.com/catfool/blog/item/c06bec3931a0efcad4622524.html 聚类算法学习指南&#xff08;二&#xff09;2009-05-06 20:49下图图 3-1 聚类方法的分类示意图3.1 传统聚类算法3.1.1 层次方法层次法对给定的数据对象集合进行层次似的分解。按层次分解的形成方式&…

.NetCore跨域

描述浏览器安全策略上的安全限制可以有效阻止Ajax向另外的一个域server发起请求&#xff0c;这就是著名的同源策略&#xff0c;如何突破这种限制&#xff0c;可以使用CORS。public static void AddCommon(this IServiceCollection services){services.AddCors(options >{opt…

山东大学计算机非全上课,山东大学非全日制研究生上课方式

【导读】山东大学非全日制研究生上课方式。如今非全日制研究生考试已经与全日制一样&#xff0c;连考试内容和时间也都是一样。许多想要报考山东大学非全日制研究生的人员开始担心&#xff0c;非全日制研究生和全日制研究生的考试样了&#xff0c;那么上课方式会不会也是一样的…

【转载】可复用的FS

有很多朋友要求给出一个应用ESFramework的Demo&#xff0c;在前面介绍ESFramework支持的4层架构中&#xff08;回顾&#xff09;&#xff0c;有AS、FS、IRAS&#xff0c;其中FS的功能需求最简单&#xff0c;所以本文就给出一个FS实现示例。 FS主要用于管理功能插件&…

Git、GitHub、GitLab三者之间的联系以及区别

在讲区别以及联系之前先简要的介绍一下&#xff0c;这三者都是什么(本篇文章适合刚入门的新手&#xff0c;大佬请出门左转)1.什么是 Git?Git 是一个版本控制系统。版本控制是一种用于记录一个或多个文件内容变化&#xff0c;方便我们查阅特定版本修订情况的系统。以前在没有使…

zen服务器芯片,服务器版Zen处理器简直大杀器:32核64线程,8通道DDR4内存

拼 命 加 载 中 ...在这次的E3展会上&#xff0c;AMD除了公布RX 470/460显卡之外&#xff0c;还跟雷蛇发了一款支持VR的背包PC&#xff0c;使用了RX480显卡&#xff0c;处理器则是AMD的Zen&#xff0c;8核16线程&#xff0c;这还只是桌面版的&#xff0c;要知道Zen处理器最重要…