当前位置: 移动技术网 > IT编程>开发语言>.net > 详解asp.net core 依赖注入

详解asp.net core 依赖注入

2020年08月17日  | 移动技术网IT编程  | 我要评论
前言  好久没有写微博了,因为前段时间由于家庭原因决定从工作了3年多的北京转移到上海去。依赖注入在学习net core的时候也有写过类似的东西,只是实践的较少,结果来到上海新公司系统框架涉及到了这块知

前言

  好久没有写微博了,因为前段时间由于家庭原因决定从工作了3年多的北京转移到上海去。依赖注入在学习net core的时候也有写过类似的东西,只是实践的较少,结果来到上海新公司系统框架涉及到了这块知识点,所以在了解完自己的项目之后决定做一些相关的总结。接下来就让我们先来了解hewi依赖注入。

什么是依赖注入

  依赖注入,全称是“依赖注入到容器”, 容器(ioc容器)是一个设计模式,它也是个对象,你把某个类(不管有多少依赖关系)放入这个容器中,可以“解析”出这个类的实例。所以依赖注入就是把有依赖关系的类放入容器(ioc容器)中,然后解析出这个类的实例。划重点:依赖注入是为了实现控制反转的一种设计模式。【现在知道gof之外还有其他的设计模式了吧。】

为什么要用依赖注入

  我们编程希望高内聚低耦合,所以解耦是很多理论的出发点,依赖注入控制反转也是为了解耦。那么冒昧问一下啊低耦合是什么?我的理解就是:我们在编程过程中,我们不需要知道组件与类库的内容只需知道他们提供的接口,调用接口就能实现功能,我们就说这种情况是低耦合。

  在没有接触到依赖注入的时候,解耦的思路其实也就是gof设计模式和设计原则。我以前分享的很多文章牵涉到的封装类库都是基于面向接口的方式。举个例子:

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);
}
}

以上是在做商城经常写的一个基类。比如我们以前商城中购物车下单就算其总价的方法调用的时候。

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别人也是讲的这种方式,下面看一下代码。设置一个服务类接口类型的数据成员,并以构造函数为注入点,这个构造函数接受一个具体的服务类实例为参数,并将它赋给服务类接口类型的数据成员。

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完全没有关系,不需要了解他是怎么实现的。这就是依赖注入。这种叫做构造注入。

在我们讨论下一种注入的方式的时候,有个问题其实还没有解决。“依赖是如何产生的?”把依赖当作构造函数参数来写,尽管使用这可以手动提供这种依赖,但是当整个系统都依赖注入,那就意味着任何一个组件我们都需要知如道满足每一部分的需求(服务定位器),是不是很头大?那么这时我们就要要引入一个概念的“容器”-----依赖注入容器。

protected override void registerbuilder(containerbuilderwrapper builder)
 {
  base.registerbuilder(builder);      //注入仓储
  builder.registertype<order>().as<iorder>();
 }

以上为mvc容器的一种实现。as 后边是服务类继承的接口,其实我对它的理解就是:如果有人请求这种类型。我们就给他这个类型的对象。

属性注入

其实依赖注入spring相关的资料应该有很多,所以很多知识点也是通过java那的理论借鉴过来的。属性注入我确实看的net的书了解的。

如果需要使用到被依赖对象的某个属性,在被依赖对象被创建之后,ioc容器会自动初始化该属性

首先还是定一个接口

public interface iorder
 {
  {
  //product 产品对象
  decimal valueproducts(params product[] products);
  }
 }

属性注入如下:

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方法接受一个具体的服务类实例为参数,并将它赋给服务类接口类型的数据成员。其实这种是注入方式较为灵活使用者也较多。

//服务接口
 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 依赖注入的资料请关注移动技术网其它相关文章!

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网