大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进。

在本章中,我们将学习ASP.NET Core的依赖项注入(DI)以及如何自定义它。

我们将讨论以下主题:

  • 使用不同的DI容器
  • 探索ConfigureServices方法
  • 使用其他的ServiceProvider
  • Scrutor简介

技术准备

我们使用以下命令(你可以在console, shell,Bash终端),创建一个MVC应用:

dotnet new mvc -n DiSample -o DiSample

在Visual Studio中打开项目,或在控制台中键入以下命令,在Visual Studio Code中打开项目:

cd DiSample
code .

使用不同的DI容器

在大多数项目中,我们其实不需要使用不同的DI容器。ASP.NET Core中的现有DI基本上满足我们的需要。但是,你可能喜欢在他DI容器的其他功能:

  • 使用Ninject创建一个支持模块作为轻量级依赖项的应用程序。比如,您可能希望将模块放入特定目录中,并在应用程序中自动注册这些模块。
  • 在应用程序外部的配置文件中,比如,在XML或JSON文件中,而不是仅在C#中配置服务。这是各种DI容器中的常见功能,但ASP.NET Core中尚不支持。
  • 在运行时添加服务,获取动态的DI容器,这也是一些DI容器中的常见特性。

现在,让我们看看ConfigureServices方法是如何操作的。

探索ConfigureServices方法

我们将当前的ConfigureServices方法与以前的长期支持版本(TLS)进行比较,看看有什么变化。如果您使用版本3.1创建的ASP.NET Core项目,并打开Startup.cs文件,配置服务的方法如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {          options.CheckConsentNeeded = context => true;
    });
    services.AddControllersWithViews();
    services.AddRazorPages();
}

相反,在 ASP.NET Core 6.0,没有启动Startup.cs,服务的配置在Startup.cs中进行,如下所示:

var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
var app = builder.Build();
// The rest of the file isn't relevant for this chapter

这两种情况都可以获得IServiceCollection,其中默认已经填充了ASP.NET Core所需的一组服务,比如宿主服务、ConfigureServices方法之前执行的相关服务。

以上方法中,添加了更多的服务。

  • 首先,将包含cookie策略选项的配置类添加到ServiceCollection
  • AddMvc()方法添加MVC框架所需的服务。

    到目前为止,我们有大约140个服务注册到IServiceCollection

    但是,服务集合不是实际的DI容器,真实的DI容器被包装在所谓的服务提供者中(ServiceProvider)。

那么应该如何获取DI容器呢?

IServiceCollection有了一个扩展方法,它用于从服务集合中创建IServiceProvider,代码如下:

IServiceProvider provider = services.BuildServiceProvider()

ServiceProvider包含不可变容器,即在运行时无法更改。在ConfigureServices方法执行后,会在后台创建IServiceProvider

接下来,我们再看下如何在在DI定制过程中,替代IServiceProvider

使用其他IServiceProvider

如果其他容器已经支持ASP.NET Core,则更改为其他或自定义DI容器将变得非常容易。通常,第三方DI容器会使用IServiceCollection做为自己的容器,它通过循环集合将已注册的服务移动到另一个容器。

我们用Autofac作为第三方容器举个例子。在命令行中键入以下命令加载NuGet包:

dotnet add package Autofac.Extensions.DependencyInjection

要注册自定义IoC容器,通常需要注册不同的IServiceProviderFactoryIServiceProviderFactory将创建一个ServiceProvider实例。如果第三方容器支持ASP.NET Core,则必须提供一个该工厂类。如果你要使用Autofac,则需要使用AutofacServiceProviderFactory

我们在Program.cs中给IHostBuilder编写一个扩展方法,内部注册一个AutofacServiceProviderFactory

using Autofac;
using Autofac.Extensions.DependencyInjection;
namespace DiSample; public static class IHostBuilderExtension {     
public static IHostBuilder UseAutofacServiceProviderFactory(this IHostBuilder hostbuilder)    
 {         
hostbuilder.UseServiceProviderFactory (new AutofacServiceProviderFactory());         
return hostbuilder;     
}
}

注意,不要忘记将引入名称空间:AutofacAutofac.Extensions.DependencyInjection

要使用此扩展方法,可以在Program.cs中使用AutofacServiceProvider

var builder = WebApplication.CreateBuilder(args);
builder.Host.UseAutofacServiceProviderFactory();
// Add services to the container.
builder.Services.AddControllersWithViews();

以上通过扩展方法将AutofacServiceProviderFactory添加到IHostBuilder中,并启用AutofacIoC容器。后续会转而使用AutofacIServiceCollection添加服务。

再强调一下,除非必要。通常,我们不一定要替换现有的.NET CoreDI容器。

Scrutor简介

在本章的开头,我提到了服务的自动注册,这里可以通过其他DI容器完成。这里介绍一个名为Scrutor的不错的NuGet包来实现。

Scrutor通过向.NET Core DI容器向IServiceCollection添加一个扩展方法,用以自动注册服务。

扩展阅读

这里介绍一篇关于Scrutor的非常详细的博客文章,建议您继续阅读这篇文章以了解更多信息。

回顾

通过以上演示,我们将能够使用任何.NET标准兼容的DI容器替换现有容器。如果您选择的容器不包括ServiceProvider,请自己实现一个IServiceProvider接口,并在其中使用DI容器。如果您选择的容器没有提供填充服务的方法,请自行创建自己的方法。循环已注册的服务并将其添加到另一个容器中。

最后一步听起来很简单,实现起来比较费劲,因为需要将所有的IServiceCollection注册转换为其他容器的注册,它的复杂性取决于其他DI容器的实现细节。

任何时候,我们都可以选择使用任何与.NET标准兼容的DI容器,替换ASP.NET Core中的许多默认实现。

在下一章我们将探讨如何以不同的方式配置HTTPS,感谢您的阅读。

定制.NET 6.0的依赖注入的更多相关文章

  1. Asp.Net Core 3.0的依赖注入改变

    Asp.Net Core 3.0出来很久了,预览版的时候就被我偶像Lemon大人,带着尝试摸索了一下这个 那么Asp.Net Core 3.0和Asp.Net Core 2.X到底有哪些区别呢? As ...

  2. Asp.Net Mvc3.0(MEF依赖注入实例)

    前言 在http://www.cnblogs.com/aehyok/p/3386650.html前面一节主要是对MEF进行简单的介绍.本节主要来介绍如何在Asp.Net Mvc3.0中使用MEF. 准 ...

  3. 基础教程:视图中的ASP.NET Core 2.0 MVC依赖注入

    问题 如何在ASP.NET Core MVC Views中注入和使用服务. 解 更新 启动 类来为MVC添加服务和中间件. 添加一项服务 添加一个Controller,返回 ViewResult. 添 ...

  4. .NET CORE 2.0之 依赖注入在类中获取IHostingEnvironment,HttpContext

    在.NET CORE 中,依赖注入非常常见, 在原先的 HttpContext中常用的server.Mappath已经么有了如下: HttpContext.Current.Server.MapPath ...

  5. Asp.Net Mvc3.0(MEF依赖注入理论)

    前言 Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,它是一系列特性的集合,包括依赖注入(DI)等.MEF为开发人员提供了一个工具,让我们 ...

  6. ASP.NET MVC3使用Unity2.0实现依赖注入(转载和扩展)

    http://note.youdao.com/share/?id=53252d0f897e0e109aadd296a1682354&type=note

  7. 05、NetCore2.0依赖注入(DI)之Web应用启动流程管理

    05.NetCore2.0依赖注入(DI)之Web应用启动流程管理 在一个Asp.net core 2.0 Web应用程序中,启动过程都做了些什么?NetCore2.0的依赖注入(DI)框架是如何管理 ...

  8. 谈谈php里的IOC控制反转,DI依赖注入

    理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...

  9. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(7):装配SpringBean·依赖注入装配

    一.依赖注入的三种方式      在实际环境中实现IoC容器的方式主要分为两大类,一类是依赖查找,依赖查找是通过资源定位,把对应的资源查找回来.另一类则是依赖注入.一般而言,依赖注入可分为3中方式: ...

随机推荐

  1. nodejs教程---基于expressJs框架,实现文件上传(upload)?

    文件上传功能在nodejs初期是一件很难实现的功能,之后出现了formidable勉强能解决这个问题,但是express框架出现之后基于这个框架开发的中间件有更好的方法来处理文件上传,这个中间件就是m ...

  2. 微信小程序获取当前时间戳、获取当前时间、时间戳加减

    //获取当前时间戳 var timestamp = Date.parse(new Date()); timestamp = timestamp / 1000; console.log("当前 ...

  3. vue Element验证input提示

    <el-form-item prop="userName" class="userName_color"> <b>详细地址<i c ...

  4. centos7.3 安装oracle 详细过程

    centos7.3安装oracle详细过程1.下载Oracle安装包:linux.x64_11gR2_database_1of2.zip 和 linux.x64_11gR2_database_2of2 ...

  5. nmtui 工具使用的话,需要开启NetworkManager(网卡文件不存在ens192)

    环境采样: [root@k3master network-scripts]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) ...

  6. Go xmas2020 学习笔记 06、Control Statements、Declarations & Types

    06-Control Statements. If-then-else. Loop. for. range array. range map. infinite loop. common mistak ...

  7. Markdown练习

    这是一级标题 这是二级标题 这是三级标题 这是无序列表1 这是无序列表2 有序1 有序2 重点 计网 1. 第一章 第一部分 1.概念.组成.功能和分类 1. 概念 计算机网络是互连的.自治的计算机的 ...

  8. 开发中常用的Hook

    开发中常用的Hook 什么是Hook? Hook 是一些可以让你在函数组件里"钩入" React state 及生命周期等特性的函数,用来实现一些 class 组件的特性的. 1 ...

  9. shell基础知识讲解

    第1章 shell基础 1.1 什么叫做shell编程 shell编程也叫做bash高级编程语法 1.2 常见的shell命令解释器 bash            redhat和centos使用 d ...

  10. Azure DevOps (十一) 通过Azure Devops部署一个.NET Core WebAPI

    前几篇文章中,我们讨论了如何通过流水线实现项目的编译.上传.打包.部署等操作,今天我们来实现一套完整的流程,把之前碎片化的知识点给串起来. 本次我们使用一个ASP.NET Core的WebApi项目来 ...