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

C#控制臺程序中使用官方依賴注入的實現(xiàn)

 更新時間:2020年04月02日 11:27:30   作者:Hello沃德哥  
這篇文章主要介紹了C#控制臺程序中使用官方依賴注入的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

asp.net core 中已經(jīng)自帶了一個官方的依賴注入框架,現(xiàn)在想把它應(yīng)用到控制臺程序中,控制臺程序是最簡潔的代碼結(jié)構(gòu),摒除了其他一堆嵌入的框架代碼,只包含最簡潔的入口函數(shù),是學(xué)習(xí)基礎(chǔ)類庫框架的最佳選擇,為什么最佳,原因很簡單,沒有其他項的干擾,Demo效果清晰明了,方便寫測試代碼,調(diào)試也順暢。

1. 業(yè)務(wù)接口類設(shè)計編寫

先要寫一個測試用的接口和類,我寫了一個很簡單的計算求和的接口類和方法,方便待會注入演示效果。
我設(shè)計的演示接口很簡單,IBaseService 基礎(chǔ)接口負(fù)責(zé)生成一個隨機(jī)的數(shù)字,這個數(shù)字在構(gòu)造函數(shù)中生成,方便待會測試注入實例的生存周期,這樣設(shè)計的目的是,每回實例化都要調(diào)用構(gòu)造方法,而每次執(zhí)行構(gòu)造方法產(chǎn)生的隨機(jī)數(shù)是不一樣的,由此驗證注入的生命周期,ICalculateService 接口則負(fù)責(zé)計算求和,就是將隨機(jī)數(shù)重復(fù)相加n遍,屏幕打印結(jié)果。

/// <summary>
/// 基礎(chǔ)服務(wù)接口,用來獲取一個數(shù)字
/// </summary>
public interface IBaseService
{
	/// <summary>
	/// 數(shù)字屬性
	/// </summary>
	int Number { get; }
	/// <summary>
	/// 獲取數(shù)字方法
	/// </summary>
	/// <returns>隨機(jī)數(shù)</returns>
	int GetNumber();
}

/// <summary>
/// 計算服務(wù)接口,用來求和累加運(yùn)算
/// </summary>
public interface ICalculateService
{
	/// <summary>
	/// 求和方法
	/// </summary>
	/// <param name="count"></param>
	void Sum(int count);
}

/// <summary>
/// 計算服務(wù)
/// </summary>
public class CalculateService : ICalculateService
{
	private readonly IBaseService _baseService;
	public CalculateService(IBaseService baseService)
	{
		_baseService = baseService;
	}
	public void Sum(int n)
	{
		int sum = 0;
		for (int i = 0; i < n; i++)
		{
			sum+= _baseService.Number;
		}
		Console.WriteLine($"the result of ICalculateService is { sum }");
	}
}

/// <summary>
/// 基礎(chǔ)服務(wù)
/// </summary>
public class BaseService : IBaseService
{
	public int Number { get; }
	public BaseService()
	{
		Number = GetNumber();
		Console.WriteLine($"the Number is {Number}");
	}
	public int GetNumber()
	{
		Random rand = new Random();
		return rand.Next(1, 1000);
	}
}

2. 依賴注入使用

注入操作也和在Asp.net core中雷同,先new一個ServiceCollection,然后添加注入的所需的接口或類及范圍,
之所以要for循環(huán)3次,是為了驗證生命周期,和方便觀察調(diào)用構(gòu)造函數(shù)的次數(shù)。IBaseService接口的注入實例生命周期設(shè)置為Transient,即每次調(diào)用都會實例化一次從而產(chǎn)生新的隨機(jī)數(shù),而ICalculateService則采用單例模式,所以它的構(gòu)造方法只被調(diào)用了一次,在控制臺運(yùn)行時,會在屏幕上打印結(jié)果,清晰可辨。

static void Main(string[] args)
{
	var serviceProvider = new ServiceCollection()
	  .AddTransient<IBaseService, BaseService>()
	  .AddScoped<ICalculateService, CalculateService>()
	  //.AddSingleton<ICalculateService, CalculateService>()
	  //.AddTransient<ICalculateService, CalculateService>()
	  .BuildServiceProvider();

	for (int i = 0; i < 3; i++)
	{
		var calculateService = serviceProvider.GetService<ICalculateService>();
		calculateService.Sum(10);
	}

	var baseService = serviceProvider.GetService<IBaseService>();
	for (int i = 0; i < 3; i++)
	{
		int resultNum = baseService.GetNumber();
		Console.WriteLine($"the result of IBaseService is {resultNum}");
	}
	Console.ReadKey();
}

3. 執(zhí)行結(jié)果分析


我們可以看到ICalculateService接口的實例確實是單例,因為構(gòu)造函數(shù)只被調(diào)用了一次,隨機(jī)產(chǎn)生的數(shù)字也沒變,接著我們會把ICalculateService的注入生命周期改成Transient 瞬態(tài),看看會有什么變化。


很顯然,它執(zhí)行了五次構(gòu)造方法,也就是實例化了五次,所以每回產(chǎn)生的隨機(jī)數(shù)也不一樣了。

到此這篇關(guān)于C#控制臺程序中使用官方依賴注入的實現(xiàn)的文章就介紹到這了,更多相關(guān)C# 官方依賴注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談C#設(shè)計模式之工廠模式

    淺談C#設(shè)計模式之工廠模式

    這篇文章主要介紹了淺談C#設(shè)計模式之工廠模式,需要的朋友可以參考下
    2014-12-12
  • DevExpress實現(xiàn)GridControl同步列頭checkbox與列中checkbox狀態(tài)

    DevExpress實現(xiàn)GridControl同步列頭checkbox與列中checkbox狀態(tài)

    這篇文章主要介紹了DevExpress實現(xiàn)GridControl同步列頭checkbox與列中checkbox狀態(tài),需要的朋友可以參考下
    2014-08-08
  • 詳解C# wpf如何嵌入外部程序

    詳解C# wpf如何嵌入外部程序

    實現(xiàn)嵌入各種窗口控件后,其實還會有一種需求:嵌入外部程序,我們有時可能需要嵌入一個瀏覽器或者或者播放器等一些已有的程序,下面我們就來看看具體操作吧
    2024-04-04
  • Unity Shader實現(xiàn)徑向模糊效果

    Unity Shader實現(xiàn)徑向模糊效果

    這篇文章主要為大家詳細(xì)介紹了Unity Shader實現(xiàn)徑向模糊效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C#實現(xiàn)CSV與PDF和DataTable的快速轉(zhuǎn)換

    C#實現(xiàn)CSV與PDF和DataTable的快速轉(zhuǎn)換

    CSV作為輕量級數(shù)據(jù)載體,在數(shù)據(jù)傳輸中占比超過70%,這篇文章主要為大家介紹了如何使用C#實現(xiàn)CSV與PDF和DataTable的快速轉(zhuǎn)換,需要的可以了解下
    2025-07-07
  • C#備份文件夾的兩種方法

    C#備份文件夾的兩種方法

    在C#編程中,文件夾操作是不可或缺的一部分,它允許開發(fā)者創(chuàng)建、刪除、移動和管理文件系統(tǒng)中的目錄結(jié)構(gòu),本文給大家介紹了C#備份文件夾的兩種方法,需要的朋友可以參考下
    2024-12-12
  • 一文詳解C#?Chart控件

    一文詳解C#?Chart控件

    這篇文章主要介紹了一文學(xué)習(xí)C#?Chart控件,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • C#中struct和class的區(qū)別詳解

    C#中struct和class的區(qū)別詳解

    這篇文章主要介紹了C#中struct和class的區(qū)別,對C#初學(xué)者來說是需要牢固掌握的,需要的朋友可以參考下
    2014-08-08
  • C#處理Paint事件的方法

    C#處理Paint事件的方法

    這篇文章主要介紹了C#處理Paint事件的方法,實例分析了C#使用Paint進(jìn)行圖形繪制的技巧,需要的朋友可以參考下
    2015-06-06
  • C#中datagridview的EditingControlShowing事件用法實例

    C#中datagridview的EditingControlShowing事件用法實例

    這篇文章主要介紹了C#中datagridview的EditingControlShowing事件用法,實例分析了datagridview的EditingControlShowing事件的定義與使用技巧,需要的朋友可以參考下
    2015-06-06

最新評論

锡林郭勒盟| 遂溪县| 聂荣县| 阿克苏市| 彩票| 岚皋县| 韶山市| 晋中市| 和平县| 甘肃省| 达拉特旗| 黄龙县| 阿鲁科尔沁旗| 祥云县| 嘉义县| 宝坻区| 永修县| 洪江市| 双牌县| 莆田市| 沽源县| 乌苏市| 唐山市| 丽江市| 兰西县| 湟源县| 营山县| 凌源市| 遂溪县| 台中市| 饶河县| 陇南市| 开平市| 津南区| 石渠县| 大石桥市| 双流县| 越西县| 阳城县| 广昌县| 无极县|