定制.NET 6.0的依赖注入
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进。
在本章中,我们将学习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
容器,通常需要注册不同的IServiceProviderFactory
,IServiceProviderFactory
将创建一个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;
}
}
注意,不要忘记将引入名称空间:Autofac
和Autofac.Extensions.DependencyInjection
。
要使用此扩展方法,可以在Program.cs
中使用AutofacServiceProvider
:
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseAutofacServiceProviderFactory();
// Add services to the container.
builder.Services.AddControllersWithViews();
以上通过扩展方法将AutofacServiceProviderFactory
添加到IHostBuilder
中,并启用Autofac
IoC容器。后续会转而使用Autofac
向IServiceCollection
添加服务。
再强调一下,除非必要。通常,我们不一定要替换现有的.NET Core
DI容器。
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的依赖注入的更多相关文章
- Asp.Net Core 3.0的依赖注入改变
Asp.Net Core 3.0出来很久了,预览版的时候就被我偶像Lemon大人,带着尝试摸索了一下这个 那么Asp.Net Core 3.0和Asp.Net Core 2.X到底有哪些区别呢? As ...
- Asp.Net Mvc3.0(MEF依赖注入实例)
前言 在http://www.cnblogs.com/aehyok/p/3386650.html前面一节主要是对MEF进行简单的介绍.本节主要来介绍如何在Asp.Net Mvc3.0中使用MEF. 准 ...
- 基础教程:视图中的ASP.NET Core 2.0 MVC依赖注入
问题 如何在ASP.NET Core MVC Views中注入和使用服务. 解 更新 启动 类来为MVC添加服务和中间件. 添加一项服务 添加一个Controller,返回 ViewResult. 添 ...
- .NET CORE 2.0之 依赖注入在类中获取IHostingEnvironment,HttpContext
在.NET CORE 中,依赖注入非常常见, 在原先的 HttpContext中常用的server.Mappath已经么有了如下: HttpContext.Current.Server.MapPath ...
- Asp.Net Mvc3.0(MEF依赖注入理论)
前言 Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,它是一系列特性的集合,包括依赖注入(DI)等.MEF为开发人员提供了一个工具,让我们 ...
- ASP.NET MVC3使用Unity2.0实现依赖注入(转载和扩展)
http://note.youdao.com/share/?id=53252d0f897e0e109aadd296a1682354&type=note
- 05、NetCore2.0依赖注入(DI)之Web应用启动流程管理
05.NetCore2.0依赖注入(DI)之Web应用启动流程管理 在一个Asp.net core 2.0 Web应用程序中,启动过程都做了些什么?NetCore2.0的依赖注入(DI)框架是如何管理 ...
- 谈谈php里的IOC控制反转,DI依赖注入
理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(7):装配SpringBean·依赖注入装配
一.依赖注入的三种方式 在实际环境中实现IoC容器的方式主要分为两大类,一类是依赖查找,依赖查找是通过资源定位,把对应的资源查找回来.另一类则是依赖注入.一般而言,依赖注入可分为3中方式: ...
随机推荐
- CCF201909-2小明种苹果(续)
解题思路:解题思路很简答,就是用数组将数据存起来然后再进行统计,具体思路就见代码注释,记录这道题的是为了警示自己好好审题啊...... 审题有问题,写题火葬场啊.......以为每棵树就疏一次果,把D ...
- VUE-SSR原理和使用
开篇N问 SSR解决了什么问题?SSR存在那些问题?SSR优点缺点是什么如何使用以及原理 自我总结了有如下优势 - SSR利于seo优化,因为实现了在node中解析vue,将实例渲染成一个字符串直接 ...
- BootstrapBlazor实战 Tree树形控件使用(2)
继续上篇实战BootstrapBlazor树型控件Tree内容, 本篇主要讲解整合Freesql orm快速制作数据库后台维护页面 demo演示的是Sqlite驱动,FreeSql支持多种数据库,My ...
- numpy教程06---ndarray的进阶操作
欢迎关注公众号[Python开发实战], 获取更多内容! 工具-numpy numpy是使用Python进行数据科学的基础库.numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变 ...
- python---单链表的常用操作
class Node(object): """结点""" def __init__(self, data): self.data = dat ...
- 三个步骤,从零开始快速部署LoRaServer
2021年11月29日,ITU(国际电信联盟)标准化部门正式批准了LoRa联盟立项的"ITU-T Y.4480 Low power protocolfor wide area wireles ...
- 小天才XTC Z1S开启ADB
起因 最近入手了Apple Watch,但因系统闭源和国区App Store第三方应用实在是少,所以就开始折腾起安卓表来了.正好家里有块给小孩子用的小天才手表,所以就想到了通过ADB调试安装一些这块表 ...
- BurpSuite与Xray多级代理实现联动扫描
Xray是长亭科技推出的,最经典的莫过于代理模式下的被动扫描,它使得整个过程可控且更加精细化: 代理模式下的基本架构为,扫描器作为中间人,首先原样转发流量,并返回服务器响应给浏览器等客户端,通讯两端都 ...
- Educational Codeforces Round 121 (Rated for Div. 2)——A - Equidistant Letters
A - Equidistant Letters 题源:https://codeforces.com/contest/1626/problem/A 今天上午VP了这场CF,很遗憾的是一道题也没写出来,原 ...
- kubeadm 搭建 K8s
kubeadm 搭建 K8s 本篇主要记录一下 使用 kubeadm 搭建 k8s 详细过程 ,环境使用 VirtualBox 构建的3台虚拟机 1.环境准备 操作系统:Centos7 (CentOS ...