.net Blazor webassembly 和 webAPI 内建支持依赖注入, Winform 和 Console 应用虽然不带有依赖注入功能, 但增加依赖注入也很简单.

本文将示例如何为 WinForm 程序增加依赖注入特性, 实现通过DI容器获取Cofiguration 实例, 并读取appsettings.json文件.

========================================

安装依赖库, 有点多

========================================

Microsoft.Extensions.DependencyInjection 库, 依赖注入的类库

Microsoft.Extensions.Configuration 库, 包含IConfiguration接口 和 Configuration类

Microsoft.Extensions.Configuration.Json 库, 为 IConfiguration 增加了读取 Json 文件功能,

Microsoft.Extensions.Hosting 库, 提供 Host 静态类, 有能力从 appsettings.{env.EnvironmentName}.json 加载相应 env 的设定值, 并将设定值用于IConfiguration/ILoggerFactory中, 同时增加 Console/EventSourceLogger 等 logger. 仅适用于 Asp.Net core 和 Console 类应用

Microsoft.Extensions.Logging 库, 包含 ILogger 和 ILoggerFactory 接口

Serilog.Extensions.Logging 库, 为DI 容器提供 AddSerilog() 方法.

Serilog.Sinks.File 库, 提供 Serilog rolling logger

Serilog.Sinks.Console 库, 增加 serilog console logger

Serilog.Settings.Configuration 库, 允许在 appsetting.json 配置 Serilog, 顶层节点要求是 Serilog.

Serilog.Enrichers.Thread 和 Serilog.Enrichers.Environment 库, 为输出日志文本增加 Thread和 env 信息

========================================

appsettings.json 配置文件

========================================

配置一个 ConnectionString, 另外配 serilog

{

"ConnectionStrings": {
"oeeDb": "Server=localhost\\SQLEXPRESS01;Database=Oee;Trusted_Connection=True;"
},

"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": "Debug",
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": { "path": "Logs/serilog.txt" }
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
}
}

========================================

Program.cs , 增加DI容器

========================================

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

using Serilog;

namespace Collector
{
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
//未使用依赖注入的写法
//Application.Run(new FormMain());


//生成 DI 容器
ServiceCollection services = new ServiceCollection();
ConfigureServices(services); //注册各种服务类

//先用DI容器生成 serviceProvider, 然后通过 serviceProvider 获取Main Form的注册实例
var serviceProvider =services.BuildServiceProvider();

var formMain = serviceProvider.GetRequiredService<FormMain>(); //主动从容器中获取FormMain实例, 这是简洁写法
// var formMain = (FormMain)serviceProvider.GetService(typeof(FormMain)); //更繁琐的写法
Application.Run(formMain);
}


/// <summary>
/// 在DI容器中注册所有的服务类型
/// </summary>
/// <param name="services"></param>
private static void ConfigureServices(ServiceCollection services)
{
//注册 FormMain 类
services.AddScoped<FormMain>();

//register configuration
IConfigurationBuilder cfgBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT")}.json", optional: true, reloadOnChange: false)
;
IConfiguration configuration=cfgBuilder.Build();
services.AddSingleton<IConfiguration>(configuration);

//Create logger instance
var serilogLogger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.FromLogContext()
.CreateLogger();

//register logger
services.AddLogging(builder => {
object p = builder.AddSerilog(logger: serilogLogger, dispose: true);
});

}
}
}

========================================

FormMain.cs , 验证依赖注入的效果

========================================

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace Collector
{
public partial class FormMain : Form
{
private readonly IConfiguration _configuration;
private readonly ILogger _logger;

/// <summary>
/// 为 FormMain 构造子增加两个形参, 构造子参数将由于DI容器自动注入
/// </summary>
/// <param name="configuration"></param>
/// <param name="logger">形参必须是 ILogger泛型类型, 不能是 ILogger 类型</param>
public FormMain(IConfiguration configuration, ILogger<FormMain> logger)
{
_configuration = configuration;
_logger = logger;

InitializeComponent();
var connectionString = _configuration.GetConnectionString("oeeDb"); //从配置文件中读取oeeDb connectionString
_logger.LogInformation(connectionString); //将connection String 写入到日志文件中
}

}
}

========================================

DI容器如何实例化一个带参数的类

========================================

上面实例中 FormMain 的构造子, 仅仅含有DI容器中已有的对象, 所以在DI实例化对象时, 我们不需要关注太多就可以. 但如果 FormMain 还有其他参数, FormMain 类将如何被DI 容器管理呢?

安装 Microsoft.Extensions.Options 库, 可参考: https://csharp.christiannagel.com/2016/07/27/diwithoptions/
————————————————
版权声明:本文为CSDN博主「csdnharrychinese」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/csdnharrychinese/article/details/121463976

.Net6 winform 程序使用依赖注入的更多相关文章

  1. 大比速:remoting、WCF(http)、WCF(tcp)、WCF(RESTful)、asp.net core(RESTful) .net core 控制台程序使用依赖注入(Autofac)

    大比速:remoting.WCF(http).WCF(tcp).WCF(RESTful).asp.net core(RESTful) 近来在考虑一个服务选型,dotnet提供了众多的远程服务形式.在只 ...

  2. .Net Core控制台应用程序使用依赖注入、配置文件等

    .Net Core作为一门新语言,资料实在是太少了,并且国内学习的人也不多,虽然性能还行也跨平台了但是生态圈不发展起来也不行 刚出来的时候用 .Net Core + Dapper + Mysql 弄了 ...

  3. .net core 控制台程序使用依赖注入(Autofac)

    1.Autofac IOC 容器 ,便于在其他类获取注入的对象 using System; using System.Collections.Generic; using System.Linq; u ...

  4. 依赖注入 – ASP.NET MVC 4 系列

           从 ASP.NET MVC 3.0 开始就引入了一个新概念:依赖解析器(dependence resolver).极大的增强了应用程序参与依赖注入的能力,更好的在 MVC 使用的服务和创 ...

  5. ASP.NET Core 依赖注入(DI)简介

    ASP.NET Core是从根本上设计来支持和利用依赖注入. ASP.NET Core应用程序可以通过将其注入到Startup类中的方法中来利用内置的框架服务,并且应用程序服务也可以配置为注入. AS ...

  6. Unity文档阅读 第三章 依赖注入与Unity

    Introduction 简介In previous chapters, you saw some of the reasons to use dependency injection and lea ...

  7. .netCore2.0 依赖注入

    依赖注入(ID)是一种实现对象及其合作者或者依赖想之间松散耦合的技术对于传统的方法来说,获取类的方法通常用new如下 public class DIController : Controller { ...

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

    翻译自 Mohamad Lawand 2021年3月24日的文章 <.NET 5 Console App with Dependency Injection, Serilog Logging, ...

  9. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  10. 在net Core3.1上基于winform实现依赖注入实例

    目录 在net Core3.1上基于winform实现依赖注入实例 1.背景 2.依赖注入 2.1依赖注入是什么? 2.1依赖注入的目的 2.2依赖注入带来的好处 2.2.1生命周期的控制 2.2.2 ...

随机推荐

  1. Blocks(单调栈)

    题干中说每次选择一个大于k的数,还要选他左右两个数其中之一加上一,最后问你最长的每个数不小于K的子序列. 这些都是障眼法,其实就是问你最长的平均值大于或等于K的最长子序列,这样就明朗了. 接下来就是找 ...

  2. 实训篇-Css-跳动的红心

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. Llama 3 开源了「GitHub 热点速览」

    近日,Meta(原 Facebook)开源了他们公司的新一代大模型 Llama 3,虽然目前只放出了 8B 和 70B 两个版本,但是在评估结果上已经优于 Claude 3 Sonnet.Mistra ...

  4. 力扣38(java)-外观数列(中等)

    题目: 给定一个正整数 n ,输出外观数列的第 n 项. 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述. 你可以将其视作是由递归公式定义的数字字符串序列: count ...

  5. 揭秘sealer背后实现整个集群一键交付的奥秘 | 龙蜥技术

    ​简介:解读集群镜像"开箱即用"神器--sealer! 编者按:集群镜像把整个集群看成一台服务器,把 k8s 看成云操作系统,实现整个集群的镜像化打包和交付,为企业级软件提供一种& ...

  6. MaxCompute Tunnel 技术原理及开发实战

    简介: MaxCompute(原名ODPS)是一种快速.完全托管的EB级数据仓库解决方案, 致力于批量结构化数据的存储和计算,为用户提供数据仓库的解决方案及分析建模服务.Tunnel是MaxCompu ...

  7. [PHP] 自定义 laravel/passport 的误区讲解

    Passport 的 Client 模型对应用户是默认的 User 模型.使用的 guards 是 api. 如果你发现自定义 passport 时总是调试不成功,那么很有可能是以下原因. /** * ...

  8. Educational Codeforces Round 160 (Rated for Div. 2)

    A 直接模拟,注意细节 #include<bits/stdc++.h> #define ll long long using namespace std; ll p[15] = {1}; ...

  9. 解决Host key verification failed.(亲测有效)

    哈喽哇,今天在访问远程服务器的时候,出现了一个小问题. 原因:之前ssh联系过服务器,重置服务器后,再次连接服务器,就会出这个问题. 一.发现问题 问题如下图代码: $ ssh root@108.61 ...

  10. git学习--GitHub上如何进行PR(Pull Request)操作

    目录 一.前言 二.实现步骤 2.1 将小红在GitHub上的Repository clone到小明的本地电脑 2.1.1 fork小红在GitHub上的Repository到小明的GitHub 2. ...