一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 詳解asp.net core 依賴注入

詳解asp.net core 依賴注入

2020-07-05 14:50王延領 ASP.NET教程

這篇文章主要介紹了詳解asp.net core 依賴注入的相關知識,文中講解非常詳細,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下

前言

  好久沒有寫微博了,因為前段時間由于家庭原因決定從工作了3年多的北京轉移到上海去。依賴注入在學習net core的時候也有寫過類似的東西,只是實踐的較少,結果來到上海新公司系統框架涉及到了這塊知識點,所以在了解完自己的項目之后決定做一些相關的總結。接下來就讓我們先來了解hewi依賴注入。

什么是依賴注入

  依賴注入,全稱是“依賴注入到容器”, 容器(IOC容器)是一個設計模式,它也是個對象,你把某個類(不管有多少依賴關系)放入這個容器中,可以“解析”出這個類的實例。所以依賴注入就是把有依賴關系的類放入容器(IOC容器)中,然后解析出這個類的實例。劃重點:依賴注入是為了實現控制反轉的一種設計模式。【現在知道gof之外還有其他的設計模式了吧?!?/p>

為什么要用依賴注入

  我們編程希望高內聚低耦合,所以解耦是很多理論的出發點,依賴注入控制反轉也是為了解耦。那么冒昧問一下啊低耦合是什么?我的理解就是:我們在編程過程中,我們不需要知道組件與類庫的內容只需知道他們提供的接口,調用接口就能實現功能,我們就說這種情況是低耦合。

  在沒有接觸到依賴注入的時候,解耦的思路其實也就是gof設計模式和設計原則。我以前分享的很多文章牽涉到的封裝類庫都是基于面向接口的方式。舉個例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public interface IOrder
{
//Product 產品對象
decimal ValueProducts(params Product[] products);
}
 
public class Order : IOrder
{
public decimal ValueProducts(params Product[] products)
{
return products.Sum(p => p.Price*p.Number);
}
}

以上是在做商城經常寫的一個基類。比如我們以前商城中購物車下單就算其總價的方法調用的時候。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ShoppingCart
 {
  //計算購物車內商品總價錢
  public decimal CalculateStockValue()
  {
  Product[] products = {
  new Product {Name = "龍牙2016新款", Number=2,ModelNo = 121,ColorID=65,SizeID=78, Price = 289.40},
  new Product {Name = "龍牙2017新款", ModelNo = 121,ColorID=65,SizeID=78, Number=2,Price =3800},
  };
  IOrder order = new Order();
  //計算商品總價錢
  decimal totalValue = order.ValueProducts(products);
  return totalValue;
  }
 }

以上是我常用的方式來處理自己的業務需求的。這種面向接口的方式,如果我們要計算金額的方式改變了,比如我們尺寸32的金額打7折,那么只需增加金額的類。改變接口實例化即可。代碼就不敲了應該都懂吧(低耦合)。那么我們可以看出ShoppingCart是依賴于接口與實現的對不對,那么現在我們考慮一個問題,購物車雖然調用接口實例化,但是它也是要依賴于order的,那么減少它的依賴性有沒有辦法——就是把他們完全分開。那么這種問題的解決就用到了依賴注入了。劃重點:依賴注入就是減少對接口實例化對象的依賴。那么怎么來實現依賴注入呢?

構造注入的實現

通過類的構造函數

第一次看net core別人也是講的這種方式,下面看一下代碼。設置一個服務類接口類型的數據成員,并以構造函數為注入點,這個構造函數接受一個具體的服務類實例為參數,并將它賦給服務類接口類型的數據成員。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ShoppingCart
 {
  IOrder order;
  //構造函數,參數為實現了IOrder 接口的類的實例
  public ShoppingCart(IOrder _order)
  {
  order = _order;
  }
  //計算購物車內商品總價錢
  public decimal CalculateStockValue()
  {
  Product[] products = {
   new Product {Name = "龍牙2016新款", Number=2,ModelNo = 121,ColorID=65,SizeID=78, Price = 289.40},
   new Product {Name = "龍牙2017新款", ModelNo = 121,ColorID=65,SizeID=78, Number=2,Price =3800}}; //計算商品總價錢
  decimal totalValue = order.ValueProducts(products);
  return totalValue;
  }

以上代碼最秒的地方就是ShoppingCart與接口IOrder的實現order完全沒有關系,不需要了解他是怎么實現的。這就是依賴注入。這種叫做構造注入。

在我們討論下一種注入的方式的時候,有個問題其實還沒有解決。“依賴是如何產生的?”把依賴當作構造函數參數來寫,盡管使用這可以手動提供這種依賴,但是當整個系統都依賴注入,那就意味著任何一個組件我們都需要知如道滿足每一部分的需求(服務定位器),是不是很頭大?那么這時我們就要要引入一個概念的“容器”-----依賴注入容器。

?
1
2
3
4
5
protected override void RegisterBuilder(ContainerBuilderWrapper builder)
 {
  base.RegisterBuilder(builder);      //注入倉儲
  builder.RegisterType<Order>().As<IOrder>();
 }

以上為mvc容器的一種實現。AS 后邊是服務類繼承的接口,其實我對它的理解就是:如果有人請求這種類型。我們就給他這個類型的對象。

屬性注入

其實依賴注入spring相關的資料應該有很多,所以很多知識點也是通過java那的理論借鑒過來的。屬性注入我確實看的net的書了解的。

如果需要使用到被依賴對象的某個屬性,在被依賴對象被創建之后,IoC容器會自動初始化該屬性

首先還是定一個接口

?
1
2
3
4
5
6
7
public interface Iorder
 {
  {
  //Product 產品對象
  decimal ValueProducts(params Product[] products);
  }
 }

屬性注入如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class ShoppingCart
 {
  private iordre _order;
  public iordre Order
  {
  get { return _order; }
  set { _order = value; }
  }
  public decimal ValueProducts(params Product[] products)
  {
  return Order.ValueProducts(products);
  }
 }

Setter注入

設置一個服務類接口類型的數據成員,并設置一個Set方法作為注入點,這個Set方法接受一個具體的服務類實例為參數,并將它賦給服務類接口類型的數據成員。其實這種是注入方式較為靈活使用者也較多。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//服務接口
 internal interface IServiceClass
 {
  String ServiceInfo();
 }
 
 //服務方法
 internal class ServiceClassA : IServiceClass
 {
  public String ServiceInfo()
  {
  return "我是ServceClassA";
  }
 }
 //服務方法
 internal class ServiceClassB : IServiceClass
 {
  public String ServiceInfo()
  {
  return "我是ServceClassB";
  }
 }
 //客戶類實現set
 internal class ClientClass
 {
  private IServiceClass _serviceImpl;
 
  public void Set_ServiceImpl(IServiceClass serviceImpl)
  {
  this._serviceImpl = serviceImpl;
  }
 
  public void ShowInfo()
  {
  Console.WriteLine(_serviceImpl.ServiceInfo());
  }
 }
 
 //調用
 class Program
 {
  static void Main(string[] args)
  {
  IServiceClass serviceA = new ServiceClassA();
  IServiceClass serviceB = new ServiceClassB();
  ClientClass client = new ClientClass();
 
  client.Set_ServiceImpl(serviceA);
  client.ShowInfo();
  client.Set_ServiceImpl(serviceB);
  client.ShowInfo();
  }
 }

結束語

其實依賴注入可聊的有很多,net core的出現依賴注入是必不可少的一個知識點。后面可聊的比如依賴注入與反射,依賴注入與多態,依賴注入的框架。。。。。。。

好久不寫博客,準備的也不夠充分。有興趣的小伙伴就去網上找去吧。

.net書的話:

《asp net mvc5 高級編程》《Dependency Injection in .NET 》(沒有中文)

java相關的書應該會多一些。有興趣的就一起學習一下吧。

以上就是詳解asp.net core 依賴注入的詳細內容,更多關于asp.net core 依賴注入的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.cnblogs.com/wyl1924/p/7795445.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久亚洲精品中文字幕60分钟 | 韩国女主播一区二区视频 | 色综合伊人色综合网站中国 | 三级小说网站 | 秋霞理论一级在线观看手机版 | 天天做日日做天天添天天欢公交车 | 成人福利视频网址 | 韩国丽卡三级作品 | 女教师雪白老汉 | 国产成人啪精品视频站午夜 | 精品国产自在现线拍国语 | 久久精品中文字幕 | 国产精品刺激好大好爽视频 | 国产精品九九久久一区hh | 好湿好紧太硬了我太爽了网站 | 校花被扒开尿口折磨憋尿 | 久久人妻少妇嫩草AV无码 | 国产亚洲综合精品一区二区三区 | 久久青草费线频观看国产 | 小小水蜜桃免费影院 | 欧美s级人做人爱c视频 | 男人在女人下面狂躁 | 天堂69亚洲精品中文字幕 | 草草在线免费视频 | ysl千人千色t9t9t9 | 免费一级日本c片完整版 | 羞羞色男人的天堂伊人久久 | 亚洲一区二区福利视频 | 人禽l交免费视频观看+视频 | 极品一区| 男人的j放进女人的p全黄 | 色偷偷影院| 黄 色 成 年人在线 幻女free性俄罗斯第一次摘花 | ass老妇黑森林pic | 国产在线视频在线观看 | 美女被灌浣肠失禁视频 | 白丝爆动漫羞羞动漫软件 | 国产精品亚洲片在线观看麻豆 | 日韩综合第一页 | 四虎网址 | 色综合天天综合网站中国 |