详解asp.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 依赖注入的资料请关注我们其它相关文章!

(0)

相关推荐

  • ASP.NET Core依赖注入系列教程之服务的注册与提供

    前言 在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core中的DI容器体现为一个实现了IServiceProvider接口的对象. ServiceProvider与ServiceDescriptor 服务的注册与提供     利用ServiceProvider来提供服务     提供一个服务实例的集合     获取ServiceProvider自身对

  • 详解ASP.NET Core 中的框架级依赖注入

    1.ASP.NET Core 中的依赖注入 此示例展示了框架级依赖注入如何在 ASP.NET Core 中工作. 其简单但功能强大,足以完成大部分的依赖注入工作.框架级依赖注入支持以下 scope: Singleton - 总是返回相同的实例 Transient - 每次都返回新的实例 Scoped - 在当前(request)范围内返回相同的实例 假设我们有两个要通过依赖注入来进行工作的工件: PageContext - 自定义请求上下文 Settings - 全局应用程序设置 这两个都是非常

  • ASP.NET Core依赖注入系列教程之控制反转(IoC)

    前言 ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化",我们将这些标准化的组件称为服务,ASP.NET在内部专门维护了一个DI容器来提供所需的服务.要了解这个DI容器以及现实其中的服务提供机制,我们先得知道什么是DI(Dependence Injection),而一旦我们提到DI,又不得不说IoC(Inverse of Control). 一.流程控

  • 详解ASP.NET Core 在 JSON 文件中配置依赖注入

    前言 在上一篇文章中写了如何在MVC中配置全局路由前缀,今天给大家介绍一下如何在在 json 文件中配置依赖注入. 在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等)时候,都是提供了专有的接口以供使用第三方的依赖注入组件,比如我们常用的会使用 Autofac.Untiy.String.Net 等,这些第三放依赖注入组件基本上都提供了一套配置注入或者配置生命周期的方式,除了直接配置到类里面之外,还提供了要么使用 xml 文件,要么使用 json 等,那么在新的

  • ASP.NET Core 过滤器中使用依赖注入知识点总结

    如何给过滤器ActionFilterAttribute也用上构造函数注入呢? 一般自定义的过滤器直接用特性方式标识就能使用 [ContentFilter] 因为构造函数在使用的时候要求传参,然后我们可以使用这个 ServiceFilter 在ASP.NET Core里,我们可以使用ServiceFilter来完成这个需求. ServiceFilter允许我们解析一个已经添加IoC容器的服务,因此我们需要把ContentFilter注册一下. services.AddScoped<ContentF

  • C#防SQL注入代码的三种方法

    对于网站的安全性,是每个网站开发者和运营者最关心的问题.网站一旦出现漏洞,那势必将造成很大的损失.为了提高网站的安全性,首先网站要防注入,最重要的是服务器的安全设施要做到位. 下面说下网站防注入的几点要素. 一:丢弃SQL语句直接拼接,虽然这个写起来很快很方便. 二:如果用SQL语句,那就使用参数化,添加Param 三:尽可能的使用存储过程,安全性能高而且处理速度也快 四:屏蔽SQL,javascript等注入(很是主要的),对于每个文件写是不太可能的.所以要找到对所有文件起作用的办法.我在网上

  • 如何获取C#中方法的执行时间以及其代码注入详解

    前言 在优化C#代码或对比某些API的效率时,通常需要测试某个方法的运行时间,可以通过DateTime来统计指定方法的执行时间,也可以使用命名空间System.Diagnostics中封装了高精度计时器QueryPerformanceCounter方法的Stopwatch类来统计指定方法的执行时间: 1.使用DateTime方法: DateTime dateTime = DateTime.Now; MyFunc(); Console.WriteLine((DateTime.Now - dateT

  • C#控制台程序中使用官方依赖注入的实现

    asp.net core 中已经自带了一个官方的依赖注入框架,现在想把它应用到控制台程序中,控制台程序是最简洁的代码结构,摒除了其他一堆嵌入的框架代码,只包含最简洁的入口函数,是学习基础类库框架的最佳选择,为什么最佳,原因很简单,没有其他项的干扰,Demo效果清晰明了,方便写测试代码,调试也顺畅. 1. 业务接口类设计编写 先要写一个测试用的接口和类,我写了一个很简单的计算求和的接口类和方法,方便待会注入演示效果. 我设计的演示接口很简单,IBaseService 基础接口负责生成一个随机的数字

  • c#.net全站防止SQL注入类的代码

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Web; /// <summary>/// 防SQL注入检查器/// </summary>public class SqlChecker{    //当前请求对象    private HttpRequest request;    //当前响应对象    private HttpResponse respo

  • 详解asp.net core 依赖注入

    前言 好久没有写微博了,因为前段时间由于家庭原因决定从工作了3年多的北京转移到上海去.依赖注入在学习net core的时候也有写过类似的东西,只是实践的较少,结果来到上海新公司系统框架涉及到了这块知识点,所以在了解完自己的项目之后决定做一些相关的总结.接下来就让我们先来了解hewi依赖注入. 什么是依赖注入 依赖注入,全称是"依赖注入到容器", 容器(IOC容器)是一个设计模式,它也是个对象,你把某个类(不管有多少依赖关系)放入这个容器中,可以"解析"出这个类的实例

  • ASP.NET Core依赖注入详解

    目录 一.什么是依赖注入 二.使用框架提供的服务 三.注册服务 四.生命周期 五.请求服务 六.设计你的依赖服务 ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core应用程序可以利用内置的框架服务将它们注入到启动类的方法中,并且应用程序服务能够配置注入.由ASP.NET Core提供的默认服务容器提供了最小功能集,并不是要取代其它容器. 一.什么是依赖注入 依赖注入(Dependency injection,DI)是一种实现对象及其合作者或依赖项之间松散耦合的技术.将类

  • 详解Asp.Net Core 2.1+的视图缓存(响应缓存)

    响应缓存Razor 页与 ASP.NET 核心 2.0 中不支持. 此功能将支持ASP.NET 核心 2.1 版本. 在老的版本的MVC里面,有一种可以缓存视图的特性(OutputCache),可以保持同一个参数的请求,在N段时间内,直接从mvc的缓存中读取,不去走视图的逻辑. [OutputCache(Duration =20)]//设置过期时间为20秒 public ActionResult ExampleCacheAction() { var time=DateTime.Now.ToStr

  • 详解ASP.NET Core 反向代理部署知多少

    引言 最近在折腾统一认证中心,看到开源项目IdentityServer4.Admin集成了IdentityServer4和管理面板,就直接拿过来用了.在尝试Nginx部署时遇到了诸如虚拟目录映射,请求头超长.基础路径映射有误等问题,简单记录,以供后人参考. Nginx 配置路由转发 首先来看下IdentityServer4.Admin的项目结构: IdentityServer4.Admin / ├── Id4.Admin.Api # 用于提供访问Id4资源的WebApi项目 ├── Id4.Ad

  • 详解ASP.NET Core中配置监听URLs的五种方式

    默认情况下,ASP. NET Core应用会监听一下2个Url: http://localhost:5000 https://localhost:5001 在本篇博文中,我将展示如何使用五种不同的方式改变应用监听的URLs. 在ASP.NET Core项目启动时,有多种配置监听Url的方式,在我之前的一篇博客中,已经展示了在ASP.NET Core 1.0中如何应用不同的方式配置,在ASP.NET Core 3.x中,大部分方式还是一样的. UseUrls() - 在Program.cs配置程序

  • 详解ASP.NET Core端点路由的作用原理

    端点路由(Endpoint Routing)最早出现在ASP.NET Core2.2,在ASP.NET Core3.0提升为一等公民. Endpoint Routing的动机 在端点路由出现之前,我们一般在请求处理管道的末尾,定义MVC中间件解析路由.这种方式意味着在处理管道中,MVC中间件之前的中间件将无法获得路由信息. 路由信息对于某些中间件非常有用,比如CORS.认证中间件(认证过程可能会用到路由信息). 同时端点路由提炼出端点概念,解耦路由匹配逻辑.请求分发. Endpoint Rout

  • 详解C#中的依赖注入和IoC容器

    在本文中,我们将通过用C#重构一个非常简单的代码示例来解释依赖注入和IoC容器. 简介: 依赖注入和IoC乍一看可能相当复杂,但它们非常容易学习和理解. 在本文中,我们将通过在C#中重构一个非常简单的代码示例来解释依赖注入和IoC容器. 要求: 构建一个允许用户查看可用产品并按名称搜索产品的应用程序. 第一次尝试: 我们将从创建分层架构开始.使用分层架构有多个好处,但我们不会在本文中列出它们,因为我们关注的是依赖注入. 下面是应用程序的类图: 首先,我们将从创建一个Product类开始: pub

  • 详解ASP.NET Core Web Api之JWT刷新Token

    前言 如题,本节我们进入JWT最后一节内容,JWT本质上就是从身份认证服务器获取访问令牌,继而对于用户后续可访问受保护资源,但是关键问题是:访问令牌的生命周期到底设置成多久呢?见过一些使用JWT的童鞋会将JWT过期时间设置成很长,有的几个小时,有的一天,有的甚至一个月,这么做当然存在问题,如果被恶意获得访问令牌,那么可在整个生命周期中使用访问令牌,也就是说存在冒充用户身份,此时身份认证服务器当然也就是始终信任该冒牌访问令牌,若要使得冒牌访问令牌无效,唯一的方案则是修改密钥,但是如果我们这么做了,

  • 详解PHP设计模式之依赖注入模式

    目的 实现了松耦合的软件架构,可得到更好的测试,管理和扩展的代码 用法 DatabaseConfiguration 被注入 DatabaseConnection 并获取所需的 $config .如果没有依赖注入模式, 配置将直接创建 DatabaseConnection .这对测试和扩展来说很不好. 例子 Doctrine2 ORM 使用依赖注入. 例如,注入到 Connection 对象的配置. 对于测试而言, 可以轻松的创建可扩展的模拟数据并注入到 Connection 对象中. Symfo

随机推荐