【ASP.NET Core學習】基礎

来源:https://www.cnblogs.com/WilsonPan/archive/2019/10/29/11751028.html
-Advertisement-
Play Games

【ASP.NET Core學習】基礎知識,配置文件,日誌,依賴註入 ...


新建項目時,程式入口調用CreateDefaultBuilder(args),下麵是源代碼
public static IHostBuilder CreateDefaultBuilder(string[] args)
{
    var builder = new HostBuilder();

    builder.UseContentRoot(Directory.GetCurrentDirectory());
    builder.ConfigureHostConfiguration(config =>
    {
        config.AddEnvironmentVariables(prefix: "DOTNET_");
        if (args != null)
        {
            config.AddCommandLine(args);
        }
    });

    builder.ConfigureAppConfiguration((hostingContext, config) =>
    {
        var env = hostingContext.HostingEnvironment;

        config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

        if (env.IsDevelopment() && !string.IsNullOrEmpty(env.ApplicationName))
        {
            var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
            if (appAssembly != null)
            {
                config.AddUserSecrets(appAssembly, optional: true);
            }
        }

        config.AddEnvironmentVariables();

        if (args != null)
        {
            config.AddCommandLine(args);
        }
    })
    .ConfigureLogging((hostingContext, logging) =>
    {
        var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);

        // IMPORTANT: This needs to be added *before* configuration is loaded, this lets
        // the defaults be overridden by the configuration.
        if (isWindows)
        {
            // Default the EventLogLoggerProvider to warning or above
            logging.AddFilter<EventLogLoggerProvider>(level => level >= LogLevel.Warning);
        }

        logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
        logging.AddConsole();
        logging.AddDebug();
        logging.AddEventSourceLogger();

        if (isWindows)
        {
            // Add the EventLogLoggerProvider on windows machines
            logging.AddEventLog();
        }
    })
    .UseDefaultServiceProvider((context, options) =>
    {
        var isDevelopment = context.HostingEnvironment.IsDevelopment();
        options.ValidateScopes = isDevelopment;
        options.ValidateOnBuild = isDevelopment;
    });

    return builder;
}
View Code

從上面代碼看見這個方法幫我們處理的東西

  1. 設置根目錄為當前目錄
  2. 配置應用程式配置
  3. 配置日誌配置
  4. 配置依賴註入

配置文件

配置文件內容如下
{"Setting": {
    "Name": "Wilson",
    "Date": "2019-10-28"    
  }
}
 一、註入IConfiguration
public IndexModel(IConfiguration config)
{
  
var name = config.GetSection("Setting").GetValue<string>("Name");
  var date = config.GetSection("Setting").GetValue<DateTime>("Date");
}

二、通過IOptions註入

1. 在ConfigureServices添加Options支持和配置文件節點

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();
    services.Configure<Setting>(Configuration.GetSection("Setting"));
}

2. 構造函數裡面註入IOptions

public IndexModel(IOptions<Setting> option)
{
    var setting = option.Value;

    var name = setting.Name;
    var date = setting.Date;
}

三、綁定到類

public IndexModel(IConfiguration config)
{
    var setting = new Setting();
    config.GetSection("Setting").Bind(setting);
}

或者

public IndexModel(IConfiguration config)
{
    var setting = config.GetSection("Setting").Get<Setting>();
}

四、頁面讀取配置文件

@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration

<div class="text-center">
    <h3 class="color-red">@Configuration["Setting:Name"]</h3>
</div>

 

我個人推薦使用第二種方式去讀取配置文件,因為它隱藏瞭如何讀取配置文件,只需要獲取我們關心的信息即可,第一,第三種都在不同地方使用硬編碼的方式去讀取(當然可以設置為常量),而且還有知道節點信息

開發過程通常不同環境是讀取不同配置,ASPNET Core提供了一個很方便的方法去實現

截取源代碼部分代碼

var env = hostingContext.HostingEnvironment;

config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

 它會除了載入appsettings.json外,還好載入當前環境的json配置文件

 我們只要設置當前環境環境變數(項目設置或者當前電腦環境變數添加ASPNETCORE_ENVIRONMENT)就能載入不同配置文件

 

日誌

截取源代碼部分代碼

var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);

// IMPORTANT: This needs to be added *before* configuration is loaded, this lets
// the defaults be overridden by the configuration.
if (isWindows)
{
    // Default the EventLogLoggerProvider to warning or above
    logging.AddFilter<EventLogLoggerProvider>(level => level >= LogLevel.Warning);
}

logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();

if (isWindows)
{
    // Add the EventLogLoggerProvider on windows machines
    logging.AddEventLog();
}

除了配置基本信息,Windows操作系統Waring以上的日誌還會寫入到EventLog

現在我們寫幾個日誌試試,因為配置了,所以我們直接註入logger寫日誌

public IndexModel(Logger<IndexModel> logger)
{
    logger.LogDebug("This is Debug Message");
    logger.LogInformation("This is Information Message");
    logger.LogWarning("This is Warning Message");
    logger.LogError("This is Error Message");
}

看到控制台輸出

 接著我們看看Evenlog有沒有寫入數

 

 我們看到警告基本以上的日誌都寫入了

 

實際應用我們通常需要將日誌寫入文本文件,但ASPNET Core內置日誌記錄提供程式並沒有提供文本文件的程式,但是我們可以使用第三方日誌組件(例如log4net)

1. Nuget添加log4net(Microsoft.Extensions.Logging.Log4Net.AspNetCore)

2. 調用日誌記錄框架提供的 ILoggerFactory 擴展方法。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddLog4Net();
    .....
}

 

 訪問一下,看看寫入日誌

 

可以看到,除了中間那段是我們寫入的,其他都是系統的日誌

在源代碼裡面可以看到,系統是添加Logging節點的配置信息,裡面可以指定日誌類別

"Logging": {
  "LogLevel": {
    "Default": "Debug",
    "System": "Warning",
    "Microsoft": "Warning"
  }
}
 指定System和Microsoft類別為Warning,只有高於這個級別才會輸出到日誌

 可以設置莫一類別的日誌級別

"Logging": {
  "LogLevel": {
    "Default": "Debug",
    "System": "Warning",
    "Microsoft": "Information",
    "Microsoft.AspNetCore.Mvc":"Warning"
  }
}

 只能設置大的級別再設置小級別才有效,即若只設置Microsoft.AspNetCore.Mvc,不設置Microsoft就不起效果

 

依賴註入

ASP.NET Core 支持依賴關係註入 (DI) 軟體設計模式,這是一種在類及其依賴關係之間實現控制反轉 (IoC) 的技術。

在CreateDefaultBuilder最後是一個擴展方法,使用預設的DefaultServiceProviderFactory

ASP.NET Core 提供三種註冊方法

方法描述適合場景
AddTransient  每次從服務容器進行請求時都是新建 輕量級、 無狀態的服務
AddScoped  每次請求/連接是同一個對象 Http請求需要保持同一個對象
AddSingleton  單例 單例對象 

 

 

 

 

一、添加服務

public void ConfigureServices(IServiceCollection services)
{
  ...
  services.AddSingleton
<IServiceSingleton, ServiceSingleton>(); services.AddScoped<IServiceScoped, ServiceScoped>(); services.AddTransient<IServicesTransient, ServicesTransient>(); services.AddTransient<IMyService, MyService>(); }

 

二、 獲取服務方式 1. 構造函數獲取
public IndexModel(IServicesTransient servicesTransient)
{
}

 2. 通過IHttpContextAccessor獲取

  2.1 註入IHttpContextAccessor

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

   2.2 通過RequestServices獲取

var service = accessor.HttpContext.RequestServices.GetService<IMyService>();
service.Run();

 

 

三、使用第三方容器

內置的容器實現最基本的註入方式,已經能滿足大部分項目需求。但是有時候可能需要特殊的需求,例如屬性註入、基於名稱的註入、自定義生存期管理等功能時,內置的容器不支持這些功能。下麵介紹如何替換內置容器,以Autofac為例

1. nuget 添加Autofac.Extensions.DependencyInjection

2. Program替換容器

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())

 

3. Startup類添加方法ConfigureContainer 

public void ConfigureContainer(ContainerBuilder builder)
{
    builder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>();

    builder.RegisterAssemblyTypes(System.Reflection.Assembly.GetExecutingAssembly())
            .Where(m => m.Name.Contains("Service"))
            .AsImplementedInterfaces()
            .InstancePerLifetimeScope();
}

這是ASPNET Core 3.0+版本替換Autofac方法,3.0不支持返回IServiceProvider 

Autofac.Extensions.DependencyInjection
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spring之AOP初步認識 【1】AOP概覽 什麼是AOP? (來自百度) ​ 在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切麵編程,通過預編譯方式和運行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,也是Sp ...
  • 概述 HikariCP提供了一些監控指標,他的監控指標都是基於MicroMeter提供出來的,然後支持Prometheus和Dropwizard。本次我們將討論一下HikariCp的監控指標有哪些,為什麼提供這些指標,以及咱們如何去做監控。 監控指標 就像 提供的那樣,幾個重要的指標都存儲在pool ...
  • 主要做兩個事,從properties配置文件中讀取信息,通過反射創建對象 思路主要有兩種,遍歷得到的屬性集合,然後設置類的屬性 遍歷類的屬性集合,從配置文件中讀取(不推薦,因為類的屬性有多樣化,會報錯) 以上方法要註意幾點: 註入的類的屬性要是String類,如果是其他類,要調用相應的方法,不然會報 ...
  • 練習:將文本中的內容用詞雲的形式輸出 實現: 實現效果: ...
  • uvm_objection和uvm_component基礎 uvm_objection和uvm_component是uvm中兩大基礎類,剛開始學習的時候,對兩個東西認識不深,以為它們倆差不多,誰知道它兩是一個是“爺爺”,一個是孫子的關係,兩者貫穿整個 uvm驗證方法學。至於為什麼要劃分uvm_obj ...
  • Redis是一個key-value資料庫,支持存儲的value類型包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。在Java中,使用較為廣泛的客戶端有Redisson、Jedis。Spring Data Redis模... ...
  • 隨著互聯網時代的不斷發展,開發者可能會面臨這樣的困境:為瞭解決問題、提升開發效率而竭力研發出來的“創新”,似乎削弱了他們在公司的重要程度,甚至取代了他們原先的地位。比如,在雲原生時代,部分企業更願意選擇 K8s 來解決運維、彈性的問題,而不是組建一支需要耗費大量雇佣資金、管理資金的研發團隊。 對於 ...
  • 對於剛入門的Pythoner在學習過程中運行代碼是或多或少會遇到一些錯誤,剛開始可能看起來比較費勁。隨著代碼量的積累,熟能生巧當遇到一些運行時錯誤時能夠很快的定位問題原題。下麵整理了常見的17個錯誤,希望能夠幫助到大家。 1、忘記在if,for,def,elif,else,class等聲明末尾加 : ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...