服务注册自治,降低 ASP.NET Core Web API 依赖注入的耦合度和复杂度

本文主要是介绍服务注册自治,降低 ASP.NET Core Web API 依赖注入的耦合度和复杂度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

image

前言

在软件的实际开发中,一个软件通常由多个项目组成,这些项目都会直接或者间接被主 ASP.NET Core 项目引用。

这些项目中通常都会用到若干个被注入的服务,因此我们需要在主 ASP.NET Core 项目的 Program.cs 中注册这些服务。这样不仅会增加了 Program.cs 管理的复杂度,而且也增加了项目的耦合度。

如果能让各个项目负责各自的服务注册,就能够减小项目之间的耦合度。

Step By Step 步骤

  1. 创建类库项目 "SampleService”

  2. 创建接口IMyService

    namespace SampleService
    {public interface IMyService{void SayHello();}
    }
    
  3. 创建类库项目 "SampleServiceImpl1” ,并引用 "SampleService” 项目

  4. 创建 IMyService 的实现类 CnService

    using SampleService;namespace SampleServiceImpl1
    {public class CnService : IMyService{public void SayHello(){Console.WriteLine("你好");}}
    }
    
  5. 引用 Nuget 包 Zack.Commons

  6. 创建Zack.Commons中的 IModuleInitializer 接口的实现类 ModuleInitializer

    using Microsoft.Extensions.DependencyInjection;
    using Zack.Commons;
    using SampleServiceImpl1;
    using SampleService;class ModuleInitializer : IModuleInitializer
    {public void Initialize(IServiceCollection services){// 把 CnService 注册为 IMyService 的实现服务services.AddScoped<IMyService, CnService>();}
    }
    
  7. 创建类库项目 "SampleServiceImpl2” ,重复 3~6 步骤,注意不同的代码:

    1. IMyService 的实现类 EnService

      using SampleService;namespace SampleServiceImpl2
      {public class EnService : IMyService{public void SayHello(){Console.WriteLine("Hello");}}
      }
      
    2. IModuleInitializer 接口的实现类 ModuleInitializer

      using Microsoft.Extensions.DependencyInjection;
      using Zack.Commons;
      using SampleServiceImpl2;
      using SampleService;class ModuleInitializer : IModuleInitializer
      {public void Initialize(IServiceCollection services){// 把 EnService 注册为 IMyService 的实现服务services.AddScoped<IMyService, EnService>();}
      }
      
  8. 创建控制台项目 "MainProject”

  9. 引用 "SampleService” , "SampleServiceImpl1” , "SampleServiceImpl2” 这三个项目

  10. 引用 Nuget 包 Microsoft.Extensions.DependencyInjection

  11. 打开 Program.cs,编写服务注册和使用代码(重点看注释

    using Microsoft.Extensions.DependencyInjection;
    using SampleService;
    using Zack.Commons;// 1.创建服务注册容器
    ServiceCollection services=new ServiceCollection();// 2.调用 GetAllReferencedAssemblies 方法获取所有的用户程序集
    var assemblies = ReflectionHelper.GetAllReferencedAssemblies();// 3.调用 RunModuleInitializers 方法扫描指定程序集中所有实现了 IModuleInitializer 接口的类
    //   并且调用它们的Initialize方法来完成服务的注册
    services.RunModuleInitializers(assemblies);// 4.使用
    using var sp = services.BuildServiceProvider();var items = sp.GetServices<IMyService>();
    foreach (var item in items)
    {item?.SayHello();
    }
    

总结

控制台项目 "MainProject” 只是添加了对 "SampleServiceImpl1” 和 "SampleServiceImpl2” 的引用,
但是在项目 "MainProject” 中并没有使用代码注册 CnService 服务和 EnService 服务,服务的注册工作是由 "SampleServiceImpl1” 中的 ModuleInitializer 类完成的。

这样,我们就减小了项目之间的耦合度,实现了程序集的 "服务注册自治”

这篇关于服务注册自治,降低 ASP.NET Core Web API 依赖注入的耦合度和复杂度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/887045

相关文章

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

JavaWeb 中的 Filter组件详解

《JavaWeb中的Filter组件详解》本文详细介绍了JavaWeb中的Filter组件,包括其基本概念、工作原理、核心接口和类、配置方式以及常见应用示例,Filter可以实现请求预处理、响应后... 目录JavaWeb 中的 Filter 详解1. Filter 基本概念1.1 什么是 Filter1.

SQL 注入攻击(SQL Injection)原理、利用方式与防御策略深度解析

《SQL注入攻击(SQLInjection)原理、利用方式与防御策略深度解析》本文将从SQL注入的基本原理、攻击方式、常见利用手法,到企业级防御方案进行全面讲解,以帮助开发者和安全人员更系统地理解... 目录一、前言二、SQL 注入攻击的基本概念三、SQL 注入常见类型分析1. 基于错误回显的注入(Erro

C#借助Spire.XLS for .NET实现Excel工作表自动化样式设置

《C#借助Spire.XLSfor.NET实现Excel工作表自动化样式设置》作为C#开发者,我们经常需要处理Excel文件,本文将深入探讨如何利用C#代码,借助强大的Spire.XLSfor.N... 目录为什么需要自动化工作表样式使用 Spire.XLS for .NET 实现工作表整体样式设置样式配置

golang实现nacos获取配置和服务注册-支持集群详解

《golang实现nacos获取配置和服务注册-支持集群详解》文章介绍了如何在Go语言中使用Nacos获取配置和服务注册,支持集群初始化,客户端结构体中的IpAddresses可以配置多个地址,新客户... 目录golang nacos获取配置和服务注册-支持集群初始化客户端可选参数配置new一个客户端 支

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

python依赖管理工具UV的安装和使用教程

《python依赖管理工具UV的安装和使用教程》UV是一个用Rust编写的Python包安装和依赖管理工具,比传统工具(如pip)有着更快、更高效的体验,:本文主要介绍python依赖管理工具UV... 目录前言一、命令安装uv二、手动编译安装2.1在archlinux安装uv的依赖工具2.2从github

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py