首页 > 编程语言 >服务注册自治,降低 ASP.NET Core Web API 依赖注入的耦合度和复杂度

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

时间:2024-11-15 17:58:22浏览次数:1  
标签:Web Core IMyService 耦合度 注册 using NET public SampleService

Coding-12

前言

在软件的实际开发中,一个软件通常由多个项目组成,这些项目都会直接或者间接被主 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 类完成的。

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

往期精彩

  1. C# 静态类,高手不想让你知道的 15 个真相
  2. 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
  3. 用 C# Stopwatch 计时,让代码性能飞起来!
  4. 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
  5. 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
  6. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  7. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
  8. C# AutoMapper 10个常用方法总结
  9. C# 7个方法比较两个对象是否相等
  10. C# 去掉字符串最后一个字符的 4 种方法

image

标签:Web,Core,IMyService,耦合度,注册,using,NET,public,SampleService
From: https://www.cnblogs.com/JackyGz/p/18548412

相关文章

  • .Net Core关于项目引用和命名空间导入的一个小坑
    .NetCore关于项目引用和命名空间导入的一个小坑一、.NetCore项目嵌套引用的情况经笔者测试验证,发现对于一个.NetCore项目Root,其引用另一个.NetCore项目Root.SubA后,Root项目会自动将Root.SubA项目引用的子项目,也纳入其引用项目池中,而无需再手动引用这些子项目。但这些项目如......
  • ctfshow-web入门-SSTI(web361-web368)上
    目录1、web3612、web3623、web3634、web3645、web3656、web3667、web3678、web3681、web361测试一下存在SSTI注入方法很多(1)使用子类可以直接调用的函数来打payload1:?name={{''.__class__.__base__.__subclasses__()[94]["get_data"](0,"/flag")}}payloa......
  • Python在web中的使用
    Python在Web中的使用非常广泛。以下是一些Python在Web开发中的常见用途:1.服务器端开发:Python可以用来编写服务器端代码,处理HTTP请求和响应。常见的PythonWeb框架有Django和Flask,它们提供了构建Web应用程序的常用功能,如路由、模板引擎、数据库集成等。2.网络爬虫:Python在......
  • NVR接入录像回放平台EasyCVR视频设备轨迹回放平台分发webrtc流地址无法播放是什么原因
    在现代安防领域,视频监控技术扮演着越来越重要的角色。EasyCVR视频汇聚平台以其卓越的兼容性和灵活性,为用户提供了一个强大的视频监控解决方案。该平台不仅能够满足基本的视频监控需求,还通过一系列高级功能,如视频转码、快照、告警处理等,极大地提升了监控系统的智能化水平和操作便捷......
  • 无插件H5播放器EasyPlayer.js网页web无插件播放器选择全屏时,视频区域并没有全屏问题的
    EasyPlayer.jsH5播放器,是一款能够同时支持HTTP、HTTP-FLV、HLS(m3u8)、WS、WEBRTC、FMP4视频直播与视频点播等多种协议,支持H.264、H.265、AAC、G711A、MP3等多种音视频编码格式,支持MSE、WASM、WebCodec等多种解码方式,支持Windows、Linux、Android、iOS全平台终端的H5播放器,使用简单......
  • 网页直播/点播播放器EasyPlayer.js网页web无插件播放器渲染页面出现倒挂的原因排查
    EasyPlayer.js网页web无插件播放器属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,无须安装任何插件,起播快、延迟低、兼容性强,使用非常便捷。EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式,也能支持WebSocket-FLV、HTTP-FLV、HLS(m3u8)、WebRTC、ws......
  • 第14章 Nginx WEB服务器企业实战
    万维网(WORLDWIDEWEB,WWW)服务器,也称之为WEB服务器,主要功能是提供网上信息浏览服务。目前主流的WEB服务器软件包括:Apache、Nginx、Lighttpd、IIS、Resin、Tomcat、WebLogic、Jetty。本章介绍Nginx高性能WEB服务器、Nginx工作原理、安装配置及升级、Nginx配置文件深入剖析......
  • Sitecore debug 工具
    由于Sitecore的调试需要老是通过log来分析,而每次更新dll都需要等待一定的时间和重复执行前端的操作逻辑,特开发一个在线编辑器的方式来方便调试。警告:请勿在生产环境使用。截图构建项目打开Frontend,使用pnpmi安装依赖包,然后pnpmbuild:vite构建项目,之后去Backe......
  • Stable Diffusion Web UI - Checkpoint、Lora、Hypernetworks
    Checkpoint、Lora、Hypernetworks是StableDiffusionWebUI生图的重要工具,它们有各自的特点,结合不同的生图场景选择一个或者多个叠加使用,能够更好的命令StableDiffusion生成理想状态的图片。以人像生图用通俗的方式解释checkpoint:必不可少的模型,全局生成模型,图像的生成......
  • 【stable diffusion部署】本地部署Stable Diffusion Webui
    前言在国内使用SD的途径大致有这些:某定制整合包、大厂服务器网络部署、原版安装。使用某定制版整合包在国内应该是属于大部分。这个整合包对SD在国内的推广普及起到了很重要的作用,但也有其不足之处。比如整合包体量庞大,动不动就是10G以上,里面包含了各种定制者自己部署的插......