ASP.NET Core 依赖注入

HomeController

 public class HomeController : Controller
{
private IStudentRepository _studentRepository; //使用构造函数注入的方式注入IStudentRepository
public HomeController(IStudentRepository studentRepository)
{
_studentRepository = studentRepository;
} //返回学生的名字
public string Index()
{
return _studentRepository.GetStudent(1).Name;
}
}

注意事项 :

  • HomeController依赖于IStudentRepository来 查询 Student 数据。
  • 我们使用构造函数将IStudentRepository实例注入HomeController,而不是HomeController对IStudentRepository接口创建新的实例化。
  • 这称为构造函数注入,因为我们使用构造函数来注入依赖项。
  • 请注意,我们将注入的依赖项分配给只读字段readonly。这是一个很好的做法,因为它可以防止在方法中误操作地为其分配另一个值,比如 null。
  • 此时,如果我们运行项目,则会收到以下错误:
InvalidOperationException: Unable to resolve service for type 'StudentManagement.Model.IStudentRepository'
while attempting to activate 'StudentManagement.Controllers.HomeController'.
  • 这是因为如果有人请求实现IStudentRepository的对象,ASP .NET Core 依赖注入容器不知道要提供哪个对象实例
  • IStudentRepository可能有多个实现。在我们的项目中,我们只有一个实现,那就是MockStudentRepository

  • 顾名思义,MockStudentRepository使用内存中的学生模拟数据。

  • 在我们即将发布的视频中,我们将讨论为IStudentRepository提供另一个实现,该实现从 SQL Server 数据库中查询学生数据。

  • 现在,让我们使用MockStudentRepository。

  • 要修复 InvalidOperationException 错误,我们需要在 ASP.NET Core 中使用依赖注入容器注册MockStudentRepository类。

  • 我们在 Startup 类的 ConfigureServices()方法中执行此操作

使用 ASP.NET Core 依赖注入容器注册服务:

ASP.NET Core 提供以下 3 种方法来使用依赖项注入容器注册服务。我们使用的方法决定了注册服务的生命周期。

AddSingleton()

AddSingleton()方法创建一个Singleton服务。首次请求时会创建Singleton服务。然后,所有后续请求都使用相同的实例。因此,通常,每个应用程序只创建一次Singleton服务,并且在整个应用程序生命周期中使用该单个实例。

AddTransient()

AddTransient() 方法可以称作:暂时性模式,会创建一个 Transient 服务。每次请求时,都会创建一个新的 Transient 服务实例。

AddScoped()

AddScoped()方法创建一个 Scoped 服务。在范围内的每个请求中创建一个新的 Scoped 服务实例。例如,在 Web 应用程序中,它为每个 http 请求创建 1 个实例,但在同一 Web 请求中的其他调用中使用相同的实例,在一个客户端请求中是相同的,但在多个客户端请求中是不同的。

请不要担心,如果这一点有点令人困惑。我们将在本系列即将发布的视频中好好单独讲这三种方法。

现在,要修复 InvalidOperationException 错误,让我们使用AddSingleton()向 ASP.NET Core 依赖注入容器注册MockStudentRepository类方法如下图所示。

所以在此代码中,如果有人调用IStudentRepository,将调用MockStudentRepository的实例服务。

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<IStudentRepository, MockStudentRepository>();
}

在这一点上,您可能在想,为什么我们必须做这一切。为什么我们不能使用 new 关键字在 HomeController 中简单地创建MockStudentRepository类的实例,如下所示。

   public class HomeController : Controller
{
private readonly IStudentRepository _studentRepository; //使用构造函数注入的方式注入IStudentRepository
public HomeController(IStudentRepository studentRepository)
{
_studentRepository = new MockStudentRepository();
} //返回学生的名字
public string Index()
{
return _studentRepository.GetStudent(1).Name;
}
}

这使HomeController与MockStudentRepository紧密耦合。 稍后如果我们为IStudentRepository 提供新的实现,并且如果我们想要使用新的实现而不是MockStudentRepository,我们必须更改 HomeController 中的代码。您可能会想,这只是一行代码更改,所以这并不难。

那么,如果我们在我们的应用程序中的 50 个其他控制器中使用了这个MockStudentRepository呢? 所有 50 个控制器中的代码都必须更改。这不仅无聊而且容易出错。

简而言之,使用 new 关键字创建依赖关系的实例会产生紧密耦合,因此您的应用程序将很难更改。通过依赖注入,我们不会有这种紧密耦合。

使用依赖注入,即使我们在我们的应用程序中的 50 个其他控制器中使用了MockStudentRepository,如果我们想用不同的实现交换它,我们只需要在 Startup.cs 文件中更改以下一行代码。请注意,我们现在使用DatabaseStudentRepository而不是MockStudentRepository。

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<IStudentRepository, DatabaseStudentRepository>();
}

这样带来的效果是单元测试也变得更加容易,因为我们可以通过依赖注入轻松地交换依赖项。 如果这有点令人困惑,请不要担心。我们将在即将发布的视频中为IStudentRepository提供不同的实现。此新实现将从 SQL Server 数据库中查询数据。然后,我们将使用DatabaseStudentRepository实现替换MockStudentRepository实现。那个时候,您将了解依赖注入提供的功能和灵活性。

欢迎添加个人微信号:Like若所思。

欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!

ASP.NET Core 中的 依赖注入介绍的更多相关文章

  1. ASP.NET Core中的依赖注入(2):依赖注入(DI)

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...

  2. ASP.NET Core中的依赖注入(3): 服务的注册与提供

    在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core ...

  3. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理

    ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...

  4. ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】

    本系列前面的文章我们主要以编程的角度对ASP.NET Core的依赖注入系统进行了详细的介绍,如果读者朋友们对这些内容具有深刻的理解,我相信你们已经可以正确是使用这些与依赖注入相关的API了.如果你还 ...

  5. ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】

    通过上一篇的介绍我们应该对实现在ServiceProvider的总体设计有了一个大致的了解,但是我们刻意回避一个重要的话题,即服务实例最终究竟是采用何种方式提供出来的.ServiceProvider最 ...

  6. ASP.NET Core中的依赖注入(5):ServicePrvider实现揭秘【补充漏掉的细节】

    到目前为止,我们定义的ServiceProvider已经实现了基本的服务提供和回收功能,但是依然漏掉了一些必需的细节特性.这些特性包括如何针对IServiceProvider接口提供一个Service ...

  7. ASP.NET Core中的依赖注入(1):控制反转(IoC)

    ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...

  8. ASP.NET Core 中的依赖注入

    目录 什么是依赖注入 ASP .NET Core 中使用依赖注入 注册 使用 释放 替换为其它的 Ioc 容器 参考 什么是依赖注入 软件设计原则中有一个依赖倒置原则(DIP),为了更好的解耦,讲究要 ...

  9. ASP.NET Core 中的依赖注入 [共7篇]

    一.控制反转(IoC) ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了 ...

随机推荐

  1. 解决 cannot find reference 'LSHForest' in '__init__.py'

    from sklearn.neighbors import LSHForest cannot find reference 'LSHForest' in '__init__.py'报错 pip3 li ...

  2. BFS(四):搜索状态判重

    在采用广度优先算法进行搜索时,一个需要重点注意的是在搜索过程中判重和去重.前面介绍的几个例子中,判重都较简单,如采用vis[]数组,若vis[i]==0,则i未访问过,i入队列:若vis[i]!=0, ...

  3. 《Web前端开发》等级考试样题~以国家“1+X”职业技能证书为标准,厚溥推出Web前端开发人才培养方案

    1+x证书Web前端开发初级理论考试样题2019 http://blog.zh66.club/index.php/archives/149/ 1+x证书Web前端开发初级实操考试样题2019 http ...

  4. 【shell命令】$#、$*、$n分别表示的含义

    $#.$*.$n分别表示的含义 1.[$0] 表示当前脚本的文件名: 2.[$n] 表示传递给脚本的第n个参数值(n为1~9): 3.[$*] 表示传递给脚本的所有参数(不包括脚本名称的参数): 4. ...

  5. Docker系列之学习笔记

    一.Docker简介 1.1.Docker架构 Docker 使用客户端-服务器 (C/S) 架构模式,分为Docker守护进程和客户端,Docker 客户端,实际上是 docker 的二进制程序,D ...

  6. LeetCode 231.2的幂

    LeetCode 231.2的幂 题目: 给定一个整数,编写一个函数来判断它是否是 2 的幂次方. 算法: 若一个数是2的幂次的话定会有n & (n - 1) == 0这个关系成立 所以直接用 ...

  7. 计算机基础 ---- 编码(er)

    1.字符集与编码 字符集:字符组成的集合,汉字,字母,符号被收录到标准的字符集合 编码:规定每个字符使用一个字节还是多个字节存储,那些字节来存储的规定 术语:字符编码(character encodi ...

  8. 数据竞争检查工具(TSan)

    https://github.com/google/sanitizers/wiki https://github.com/google/sanitizers/wiki/ThreadSanitizerC ...

  9. C++回调,函数指针

    想要理解回调机制,先要理解函数指针 函数指针 函数指针指向的是函数而非对象,和其他指针一样,函数指针指向某种特定的类型 函数的类型由他的返回类型和参数类型共同决定,与函数名无关,如: bool len ...

  10. 2019-9-2-win10-uwp-判断本地ip

    原文:2019-9-2-win10-uwp-判断本地ip title author date CreateTime categories win10 uwp 判断本地ip lindexi 2019-0 ...