依赖性注入是一种技术,它允许我们注入一个特定类的依赖对象,而不是直接创建这些实例。
使用依赖注入的好处显而易见,它通过放松模块间的耦合,来增强系统的可维护性和可测试性。
依赖注入允许我们修改具体实现,而不必改变依赖于它们的依赖类型。
ASP.NET Core 很重视依赖注入技术。ASP.NET Core 中内置的依赖注入提供功能模块,并不像 StructureMap 和 Ninject 等IoC(控制反转)容器那样功能丰富,但它速度快,易于配置,而且易于使用。我们可以使用它在 ASP.NET Core 中注入框架服务和应用程序服务。
关于依赖注入和控制反转的有关知识可以参考:设计模式。
我们将介绍三种不同方法来解决 ASP.NET Core 6 中的依赖项。
本文中提供的代码示例均默认运行在 Visual Studio 2022。
1. 使用 VS2022 创建 ASP.NET Core 项目
我们在 Visual Studio 2022 中创建一个 ASP.NET Core 项目。按照以下步骤在 Visual Studio 2022 中创建一个新的 ASP.NET Core Web API 6 项目。
1) 启动 Visual Studio 2022 IDE。 2) 单击 “Create new project”。 3) 在 “Create new project” 窗口中,从显示的模板列表中选择 “ASP.NET Core Web API”。 4) 点击下一步。 5) 在 “Configure your new project” 窗口中,指定新项目的名称和位置。 6) 根据您的偏好,可选择选中 “Place solution and project in the same directory” 复选框。 7) 点击下一步。 8) 在接下来显示的 “Additional Information” 窗口中,从顶部的下拉列表中选择 .NET 6.0 作为目标框架。将 “Authentication Type” 保留为 “None”(默认)。 9) 确保未选中 “Enable docker,”、“Configure for HTTPS” 和 “Enable Open API Support” 复选框,因为我们不会在此处使用任何这些功能。您也可以选择取消选中 “Use controllers(取消选中以使用最少的 API)” 复选框,因为我们将创建自己的控制器。 10) 单击创建。这将在 Visual Studio 2022 中创建一个新的 ASP.NET Core 6 Web API 项目。我们将在本文的后续部分中使用该项目来说明解析依赖项。
2. 使用构造函数注入解决依赖关系
现在创建以下接口:
public interface ICustomFileLogger{ public string Text { get; set; } public void Log(string message);}为简单起见,我们给出一个最小的表示。
CustomFileLogger类实现 ICustomFileLogger接口,代码如下:
public class CustomFileLogger : ICustomFileLogger{ public string Text { get; set; } public void Log(string message) { // 自己的实现逻辑 }}如果使用的是 ASP.NET 5,可以在 ConfigureServices方法中注册一个 ICustomFwww.easck.comileLogger类型的实例作为一个 Scoped服务。如果使用的是 ASP.NET 6,则直接在 Program.cs 文件中注册。
4. 使用 IServiceProvider 解决依赖关系
我们有时候可能经常需要在控制器中注入许多不同的服务。如果使用构造函数注入,则必须在构造函数中指定多个参数。所以,这种场景下,有一个更好的解决方案,就是使用 IServiceProvider。
我们可以使用 IServiceCollection接口来创建依赖项注入容器。一旦创建了容器,IServiceCollection实例就会组合成一个 IServiceProvider实例。我们可以使用此实例来解析服务。
我们可以将 IServiceProvider类型的实例注入到类的任何方法中。您还可以利用 IApplicationBuilder接口的 ApplicationServices属性和 HttpContext类的 RequestServices属性来检索 IServiceProvider实例。
以下代码说明了如何注入 IServiceProvider类型的实例:
public class DefaultController : Controller{ private IServiceProvider _provider; public DefaultController(IServiceProvider provider) { _provider = provider; }}我们可以在操作方法中使用以下代码,来检索需要的任何服务实例。
ICustomFileLogger logger = (ICustomFileLogger)_provider.GetService(typeof(ICustomFileLogger));
注意 IServiceProvider的 GetService方法是如何用来检索服务实例的。
我们可以使用 HttpContext类的 RequestServices属性来检索 IServiceProvider类型的实例,然后使用该实例调用 GetService方法。
以下代码展示了HttpContext类如何做到检索实例:
ICustomFileLogger logger = (ICustomFileLogger)HttpContext.RequestServices.GetService(typeof(ICustomFileLogger));
5. 总结
依赖性注入是一种通过放松耦合来增强代码维护和可测试性的方法。
我们可以使用 ASP.NET Core 中内置的依赖注入支持来创建模块化、精简和干净的应用程序,同时也使应用程序更容易维护和测试。
参考资料:
1. 设计模式
2. C#教程
到此这篇关于三种方法解决ASP.NET Core 6中的依赖项的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。








