<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      .Net6 winform 程序使用依賴注入

      .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 信息

      補充庫:

      • Microsoft.Extensions.Options.ConfigurationExtensions 庫,  為DI容器增加了從配置文件中實例化對象的能力, 即  serviceCollection.Configure<TOptions>(IConfiguration)
      • Microsoft.Extensions.Options 庫,  提供以強類型的方式讀取configuration文件, 這是.Net中首選的讀取configuration文件方式.


       

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

      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容器管理配置文件Section

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

      上面示例, 我們通過 _configuration.GetConnectionString("oeeDb")  可以拿到connectionString, 非常方便, 這主要是得益于.Net 已經類庫已經考慮到在配置文件中存儲 connectionString 是一個普遍的做法, 所以類庫內置支持了.

      如果在 appsettings.json 中存一些自定義的信息, 如何方便讀取呢? 微軟推薦的 Options 模式, 下面詳細介紹.

      首先安裝庫:

      • Microsoft.Extensions.Options.ConfigurationExtensions 庫,  為DI容器增加了從配置文件中實例化對象的能力, 即  serviceCollection.Configure<TOptions>(IConfiguration)
      • Microsoft.Extensions.Options 庫,  提供以強類型的方式讀取configuration文件, 這是.Net中首選的讀取configuration文件方式.

      假設 appsettings.json 中要存放appKey和appSecret信息, 具體配置如下:

        "AppServiceOptions": {
          "appKey": "appkey1",
          "appSecret": "appSecret1"
        }

      定義對應的 Poco Class,  推薦后綴為 Options,

          public class AppServiceOptions
          {
              public string AppKey { get; set; } = "";
              public string AppSecret { get; set; } = "";
      
          }

       

      注冊函數 ConfigureServices()中,  注冊 AppServiceOptions 類, 告知DI容器, 要基于配置文件AppServiceOptions section來實例化

              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, 如果使用內置的 logger, 只需調用 services.AddLogging() 即可. 
                  services.AddLogging(builder => {
                      object p = builder.AddSerilog(logger: serilogLogger, dispose: true);
                  });
      
      
                  //注冊 AppServiceOptions 類, 告知DI容器, 要基于配置文件AppServiceOptions section來實例化
                  services.AddOptions();
                  services.Configure<AppServiceOptions>(configuration.GetSection("AppServiceOptions"));    
              }

       

      主動從DI容器中獲取 AppServiceOptions 配置信息代碼如下, 注意GetRequiredService函數的的泛型參數要使用 IOptions<> 包一下.

         var appServiceOptionsWrapper=serviceProvider.GetRequiredService<IOptions<AppServiceOptions>>();
         AppServiceOptions appServiceOptions= appServiceOptionsWrapper.Value;

       

      將 AppServiceOptions 注入到 FormMain 的代碼, 和主動從DI容器中獲取 AppServiceOptions 實例一樣, 都需要使用 IOptions<> 接口包一下構造子形參.

          public partial class FormMain : Form
          { 
              private readonly IConfiguration _configuration; 
              private readonly ILogger _logger;
              private AppServiceOptions _appServiceOptions;
      
              /// <summary>
              /// 為 FormMain 構造子增加三個形參, 構造子參數將由于DI容器自動注入
              /// </summary>
              /// <param name="configuration">形參必須是接口 IConfigurations</param>
              /// <param name="logger">形參必須是 ILogger泛型類型, 不能是 ILogger 類型</param>
              /// <param name="appServiceOptionsWrapper">形參必須是 IOptions 泛型接口 </param>
              public FormMain(IConfiguration configuration, ILogger<FormMain> logger, IOptions<AppServiceOptions> appServiceOptionsWrapper)  
              {
                  _configuration = configuration;
                  _logger = logger;
                  _appServiceOptions = appServiceOptionsWrapper.Value;
      
                  InitializeComponent(); 
                  var connectionString = _configuration.GetConnectionString("oeeDb");  //從配置文件中讀取oeeDb connectionString 
                  _logger.LogInformation(connectionString);   //將connection String 寫入到日志文件中
              }
      
              private void button1_Click(object sender, EventArgs e)
              {
                  this.Text = _appServiceOptions.AppKey;
              }
          }

       

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

      .net core 復雜 configuration Section 的讀取

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

      appsettings文件定義一個復雜的設置項, 頂層是一個json 數組, 里面又嵌套了另一個數組

        "PlcDevices": [
          {
            "PlcDeviceId": "Plc1",
            "IpAddress": "127.0.0.1",
            "Port": 1234,
            "SlaveId": 1,
            "DataPoints": [
              {
                "ModbusAddress": 0,
                "EqpId": "eqp1"
              },
              {
                "ModbusAddress": 0,
                "EqpId": "eqp2"
              }
            ]
          },
      
          {
            "PlcDeviceId": "Plc2",
            "IpAddress": "127.0.0.2",
            "Port": 1234,
            "SlaveId": "2",
            "DataPoints": [
              {
                "ModbusAddress": 0,
                "EqpId": "eqp3"
              },
              {
                "ModbusAddress": 0,
                "EqpId": "eqp4"
              }
            ]
          }
        ]

       

      對應poco對象為:

      public class PlcDevice
      {
          public string IpAddress { get; set; } = "";
          public int Port { get; set; } = 0;
          public string PlcDeviceId { get; set; } = "";
          public int SlaveId { get; set; } 
          public List<DataPoint> DataPoints { get; set; }
      
      }
      
      public class DataPoint
      {  public int ModbusAddress { get; set; }
          public string EqpId { get; set; } = "";
      }

       

      讀取 json 的C# 代碼:

      services.AddOptions();
      //實例化一個對應 PlcDevices json 數組對象, 使用了 IConfiguration.Get<T>()
      var PlcDeviceSettings= configuration.GetSection("PlcDevices").Get<List<PlcDevice>>();
      //或直接通過 service.Configure<T>() 將appsettings 指定 section 放入DI 容器, 這里的T 為 List<PlcDevice>
      services.Configure<List<PlcDevice>>(configuration.GetSection("PlcDevices"));

       

      posted @ 2021-11-21 21:51  harrychinese  閱讀(5683)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 国产亚洲一二三区精品| 亚洲精品无码日韩国产不卡av| 国产精品一区中文字幕| 国产精品一码二码三码| 中文字幕精品人妻丝袜| 久久大香萑太香蕉av黄软件| 国产欧美日韩亚洲一区二区三区 | 国产精品天堂蜜av在线播放| 亚欧美闷骚院| 无码伊人66久久大杳蕉网站谷歌| 成在人线av无码免费| 一区二区丝袜美腿视频| 久久精品国产亚洲av电影| 精品国产成人午夜福利| 国产高清在线不卡一区| 国产精品美女一区二区三| 在线观看国产成人AV天堂| 国产精品人妻| 亚洲狠狠婷婷综合久久久| 国产精品国产三级国产试看| 亚洲 自拍 另类小说综合图区| 日韩午夜福利片段在线观看 | 亚洲成av人片无码不卡播放器| 国产精品自在自线视频| 国产精品一起草在线观看| 久久久久国产精品熟女影院 | 日韩人妻无码精品久久| 99在线视频免费观看| 国产精品免费视频网站| 国产一区一一区高清不卡| 国产精品久久中文字幕| 99riav国产精品视频| 豆国产97在线 | 亚洲| 在线免费播放av日韩| 欧美日韩人人模人人爽人人喊| 国产免费高清69式视频在线观看 | 亚洲av产在线精品亚洲第一站| 久久久久久久久18禁秘| 乌克兰美女浓毛bbw| 98日韩精品人妻一二区| 明水县|