最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在.NET Core控制臺程序中如何使用依賴注入詳解

 更新時間:2018年10月11日 10:34:08   作者:LamondLu  
這篇文章主要給大家介紹了關(guān)于在.NET Core控制臺程序中如何使用依賴注入的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

背景介紹

Dependency Injection:又稱依賴注入,簡稱DI。在以前的開發(fā)方式中,層與層之間、類與類之間都是通過new一個對方的實(shí)例進(jìn)行相互調(diào)用,這樣在開發(fā)過程中有一個好處,可以清晰的知道在使用哪個具體的實(shí)現(xiàn)。隨著軟件體積越來越龐大,邏輯越來越復(fù)雜,當(dāng)需要更換實(shí)現(xiàn)方式,或者依賴第三方系統(tǒng)的某些接口時,這種相互之間持有具體實(shí)現(xiàn)的方式不再合適。為了應(yīng)對這種情況,就要采用契約式編程:相互之間依賴于規(guī)定好的契約(接口),不依賴于具體的實(shí)現(xiàn)。這樣帶來的好處是相互之間的依賴變得非常簡單,又稱松耦合。至于契約和具體實(shí)現(xiàn)的映射關(guān)系,則會通過配置的方式在程序啟動時由運(yùn)行時確定下來。這就會用到DI。

依賴注入(Dependency Injection), 是面向?qū)ο缶幊讨械囊环N設(shè)計原則,可以用來減低代碼之間的耦合度。在.NET Core MVC中

我們可以在Startup.cs文件的ConfigureService方法中使用服務(wù)容器IServiceCollection注冊接口及其實(shí)現(xiàn)類的映射。

例如,當(dāng)我們需要訪問Http上下文時,我們需要配置IHttpContextAccessor接口及其實(shí)現(xiàn)類HttpContextAccessor

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

那么當(dāng)我們編寫一個.NET Core控制臺程序的時候,我們該如何使用依賴注入呢?

使用內(nèi)置依賴注入

在.NET Core中,內(nèi)置依賴注入模塊使用的程序集是Microsoft.Extensions.DependencyInjection。

所以如果希望在控制臺程序中使用內(nèi)置依賴注入,我們首先需要使用NUGET添加對Microsoft.Extensions.DependencyInjection程序集的引用。

PM> Install-Package Microsoft.Extensions.DependencyInjection

這里為了說明如何使用.NET Core內(nèi)置的依賴注入模塊, 我們創(chuàng)建以下2個服務(wù)接口。

 public interface IFooService
 {
 void DoThing(int number);
 }

 public interface IBarService
 {
 void DoSomeRealWork();
 }

然后我們針對這2個服務(wù)接口,添加2個對應(yīng)的實(shí)現(xiàn)類

 public class BarService : IBarService
 {
 private readonly IFooService _fooService;
 public BarService(IFooService fooService)
 {
  _fooService = fooService;
 }

 public void DoSomeRealWork()
 {
  for (int i = 0; i < 10; i++)
  {
  _fooService.DoThing(i);
  }
 }
 }

 public class FooService : IFooService
 {
 private readonly ILogger<FooService> _logger;
 public FooService(ILoggerFactory loggerFactory)
 {
  _logger = loggerFactory.CreateLogger<FooService>();
 }

 public void DoThing(int number)
 {
  _logger.LogInformation($"Doing the thing {number}");
 }
 }

代碼解釋

  • BarService類構(gòu)造函數(shù)依賴了一個IFooService接口的實(shí)現(xiàn)
  • FooService類構(gòu)造函數(shù)依賴一個ILoggerFactory接口的實(shí)現(xiàn)
  • FooService中,我們輸出了一個Information級別的日志

在以上實(shí)現(xiàn)類代碼中,我們使用了.NET Core內(nèi)置的日志模塊, 所以我們還需要使用NUGET添加對應(yīng)的程序集Microsoft.Extensions.Logging.Console

PM> Install-Package Microsoft.Extensions.Logging.Console

最后我們來修改Program.cs, 代碼如下

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

 public class Program
 {
 public static void Main(string[] args)
 {
  //setup our DI
  var serviceProvider = new ServiceCollection()
  .AddLogging()
  .AddSingleton<IFooService, FooService>()
  .AddSingleton<IBarService, BarService>()
  .BuildServiceProvider();

  //configure console logging
  serviceProvider
  .GetService<ILoggerFactory>()
  .AddConsole(LogLevel.Debug);

  var logger = serviceProvider.GetService<ILoggerFactory>()
  .CreateLogger<Program>();
  logger.LogInformation("Starting application");

  //do the actual work here
  var bar = serviceProvider.GetService<IBarService>();
  bar.DoSomeRealWork();

  logger.LogInformation("All done!");

 }
 }

代碼解釋

  • 這里我們手動實(shí)例化了一個ServiceCollection類, 這個類是IServiceCollection>接口的一個實(shí)現(xiàn)類,它就是一個.NET Core內(nèi)置服務(wù)容器。
  • 然后我們在服務(wù)容器中注冊了IFooService接口的實(shí)現(xiàn)類FooService以及IBarService接口的實(shí)現(xiàn)類BarService。
  • 當(dāng)時需要從服務(wù)容器中獲取接口類的對應(yīng)實(shí)現(xiàn)類時,我們只需要調(diào)用服務(wù)容器類的GetSerivce方法。

最終效果

運(yùn)行程序,我們期望的日志,正確的輸出了

info: DIInConsoleApp.Program[0]
      Start application.
info: DIInConsoleApp.FooService[0]
      Doing the thing 0
info: DIInConsoleApp.FooService[0]
      Doing the thing 1
info: DIInConsoleApp.FooService[0]
      Doing the thing 2
info: DIInConsoleApp.FooService[0]
      Doing the thing 3
info: DIInConsoleApp.FooService[0]
      Doing the thing 4
info: DIInConsoleApp.FooService[0]
      Doing the thing 5
info: DIInConsoleApp.FooService[0]
      Doing the thing 6
info: DIInConsoleApp.FooService[0]
      Doing the thing 7
info: DIInConsoleApp.FooService[0]
      Doing the thing 8
info: DIInConsoleApp.FooService[0]
      Doing the thing 9
info: DIInConsoleApp.Program[0]
      All done!

使用第三方依賴注入

除了使用內(nèi)置的依賴注入模塊,我們還可以直接使用一些第三方的依賴注入框架,例如Autofac, StructureMap。

這里我們來使用StructureMap來替換當(dāng)前的內(nèi)置的依賴注入框架。

首先我們需要先添加程序集引用。

PM> Install-Package StructureMap.Microsoft.DependencyInjection

然后我們來修改Program.cs文件,代碼如下

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using StructureMap;
using System;

namespace DIInConsoleApp
{
 class Program
 {
 static void Main(string[] args)
 {
  var services = new ServiceCollection().AddLogging();

  var container = new Container();
  container.Configure(config =>
  {
  config.Scan(_ =>
  {
   _.AssemblyContainingType(typeof(Program));
   _.WithDefaultConventions();
  });

  config.Populate(services);
  });

  var serviceProvider = container.GetInstance<IServiceProvider>();

  serviceProvider.GetService<ILoggerFactory>().AddConsole(LogLevel.Debug);

  var logger = serviceProvider.GetService<ILoggerFactory>().CreateLogger<Program>();
  logger.LogInformation("Start application.");

  var bar = serviceProvider.GetService<IBarService>();
  bar.DoSomeRealWork();

  logger.LogInformation("All done!");
  Console.Read();
 }
 }
}

代碼解釋

  • 這里我們實(shí)例化了一個StructureMap的服務(wù)容器Container, 并在其Configure方法中配置了接口類及其實(shí)現(xiàn)類的自動搜索。這里使用的是一種約定,接口類必須以字母“I”開頭, 實(shí)現(xiàn)類的名字和接口類只相差一個字母“I”, 例IFooService, FooService, IBarService, BarService
  • 后續(xù)代碼和前一個例子基本一樣。雖然看起來代碼多了很多,但是實(shí)際上這種使用約定的注入方式非常強(qiáng)力,可以省去很多手動配置的代碼。

最終效果

運(yùn)行程序,代碼和之前的效果一樣

info: DIInConsoleApp.Program[0]
      Start application.
info: DIInConsoleApp.FooService[0]
      Doing the thing 0
info: DIInConsoleApp.FooService[0]
      Doing the thing 1
info: DIInConsoleApp.FooService[0]
      Doing the thing 2
info: DIInConsoleApp.FooService[0]
      Doing the thing 3
info: DIInConsoleApp.FooService[0]
      Doing the thing 4
info: DIInConsoleApp.FooService[0]
      Doing the thing 5
info: DIInConsoleApp.FooService[0]
      Doing the thing 6
info: DIInConsoleApp.FooService[0]
      Doing the thing 7
info: DIInConsoleApp.FooService[0]
      Doing the thing 8
info: DIInConsoleApp.FooService[0]
      Doing the thing 9
info: DIInConsoleApp.Program[0]
      All done!

本篇源代碼 (本地下載

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • ASP.NET編程中的十大技巧

    ASP.NET編程中的十大技巧

    ASP.NET編程中的十大技巧...
    2006-09-09
  • C# 文件保存到數(shù)據(jù)庫中或者從數(shù)據(jù)庫中讀取文件

    C# 文件保存到數(shù)據(jù)庫中或者從數(shù)據(jù)庫中讀取文件

    在編程中我們常常會遇到“將文件保存到數(shù)據(jù)庫中”這樣一個問題,雖然這已不是什么高難度的問題,但對于一些剛剛開始編程的朋友來說可能是有一點(diǎn)困難。
    2009-03-03
  • Visual Studio 2019 使用 Live Share的教程圖解

    Visual Studio 2019 使用 Live Share的教程圖解

    Visual Studio 2019 在今天發(fā)布(北京時間)了,這次帶來了一個比較有趣的 Live Share 功能,使用它可以進(jìn)行更好的協(xié)作開發(fā)。這篇文章主要介紹了Visual Studio 2019 使用 Live Share的教程,需要的朋友可以參考下
    2019-04-04
  • ASP.NET實(shí)現(xiàn)URL映射的方法

    ASP.NET實(shí)現(xiàn)URL映射的方法

    本文介紹ASP.NET中的URL映射,你可以用來在ASP.NET中干凈地映射或重寫URL,以及按照你自己的需求組織你的URL的結(jié)構(gòu)。
    2016-04-04
  • Web開發(fā)異常行為排查常用方法圖文介紹

    Web開發(fā)異常行為排查常用方法圖文介紹

    平常程序遇到錯誤,開發(fā)環(huán)境下一般都用調(diào)試搞定,生產(chǎn)環(huán)境下通過查看日志搞定。但也有搞不定的時候,本文提供了詳細(xì)的解決方案
    2012-11-11
  • 詳解.NET Core使用Quartz執(zhí)行調(diào)度任務(wù)進(jìn)階

    詳解.NET Core使用Quartz執(zhí)行調(diào)度任務(wù)進(jìn)階

    這篇文章主要介紹了.NET Core使用Quartz執(zhí)行調(diào)度任務(wù)進(jìn)階,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • JavaScript驗(yàn)證用戶輸入的是字符或數(shù)字及ASCII Chart應(yīng)用

    JavaScript驗(yàn)證用戶輸入的是字符或數(shù)字及ASCII Chart應(yīng)用

    我們可以根據(jù)onkeydown事件的event.keyCode即是ASCII Chart來判斷字符或數(shù)字等,本文提供了相關(guān)鍵盤key對應(yīng)的ASCII碼,以供用戶使用是參考及使用onpaste事件只能輸入字符和數(shù)字防止粘貼等的,感興趣的朋友可以了解下
    2013-01-01
  • .net中的session與cookies區(qū)別及使用方法

    .net中的session與cookies區(qū)別及使用方法

    cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上,cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙,考慮到安全應(yīng)當(dāng)使用session
    2013-04-04
  • Asp.Net在線預(yù)覽Word文檔的解決方案與思路詳解

    Asp.Net在線預(yù)覽Word文檔的解決方案與思路詳解

    這篇文章主要介紹了Asp.Net在線預(yù)覽Word文檔的解決方案與思路,大致思路是先將Word文檔轉(zhuǎn)換Html,再預(yù)覽Html,需要注意電腦安裝Office,需要的朋友可以參考下
    2022-04-04
  • Asp.net中UpdatePanel的用法詳解

    Asp.net中UpdatePanel的用法詳解

    本文詳細(xì)的介紹了Asp.net中UpdatePanel的用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06

最新評論

湘西| 永平县| 淮南市| 龙口市| 南投县| 黄浦区| 长沙县| 班玛县| 海原县| 永登县| 乌什县| 额敏县| 甘孜| 张掖市| 土默特左旗| 呼伦贝尔市| 平昌县| 会泽县| 通海县| 沙洋县| 将乐县| 长寿区| 清丰县| 樟树市| 南溪县| 津市市| 东港市| 长顺县| 六安市| 城市| 文昌市| 滦平县| 蓬安县| 云霄县| 白朗县| 龙南县| 于田县| 汽车| 延川县| 响水县| 汶川县|