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

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

前言

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

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


相关文章
|
8月前
|
开发框架 .NET C#
ASP.NET Core Blazor 路由配置和导航
大家好,我是码农刚子。本文系统介绍Blazor单页应用的路由机制,涵盖基础配置、路由参数、编程式导航及高级功能。通过@page指令定义路由,支持参数约束、可选参数与通配符捕获,结合NavigationManager实现页面跳转与参数传递,并演示用户管理、产品展示等典型场景,全面掌握Blazor路由从入门到实战的完整方案。
627 6
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
694 5
|
开发框架 前端开发 JavaScript
ASP.NET Web Pages - 教程
ASP.NET Web Pages 是一种用于创建动态网页的开发模式,采用HTML、CSS、JavaScript 和服务器脚本。本教程聚焦于Web Pages,介绍如何使用Razor语法结合服务器端代码与前端技术,以及利用WebMatrix工具进行开发。适合初学者入门ASP.NET。
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
1013 3
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
669 35
|
人工智能 搜索推荐 API
自学记录鸿蒙API 13:实现人脸比对Core Vision Face Comparator
在完成文本识别和人脸检测项目后,我深入学习了HarmonyOS Next API 13中的Core Vision Face Comparator API,开发了一个简单的人脸比对工具。该API能进行高精度人脸比对并给出相似度评分,应用场景广泛,如照片分类、身份认证、个性化服务等。通过初始化服务、加载图片、实现比对功能和构建用户界面,最终实现了可靠的人脸比对功能。未来计划将此技术应用于更复杂的场景,如照片管理和个性化服务,并探索与其他AI能力的结合。如果你也对人脸比对感兴趣,不妨从简单的比对功能开始,逐步实现自己的创意!
470 61
|
运维 前端开发 C#
一套以用户体验出发的.NET8 Web开源框架
一套以用户体验出发的.NET8 Web开源框架
479 7
一套以用户体验出发的.NET8 Web开源框架
|
开发框架 数据可视化 .NET
.NET 中管理 Web API 文档的两种方式
.NET 中管理 Web API 文档的两种方式
346 14
|
开发框架 .NET 程序员
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 "魔法师",用它来管理对象的生命周期,让你的代码更加模块化、易于测试和维护
700 4
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
468 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器