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

打印 上一主题 下一主题

主题 897|帖子 897|积分 2691


前言

在软件的实际开发中,一个软件通常由多个项目组成,这些项目都会直接或者间接被主 ASP.NET Core 项目引用。
这些项目中通常都会用到若干个被注入的服务,因此我们需要在主 ASP.NET Core 项目的 Program.cs 中注册这些服务。这样不仅会增加了 Program.cs 管理的复杂度,而且也增加了项目的耦合度。
如果能让各个项目负责各自的服务注册,就可以或许减小项目之间的耦合度。
Step By Step 步骤


  • 创建类库项目 "SampleService”
  • 创建接口IMyService
    1. namespace SampleService
    2. {
    3.         public interface IMyService
    4.         {
    5.                 void SayHello();
    6.         }
    7. }
    复制代码
  • 创建类库项目 "SampleServiceImpl1” ,并引用 "SampleService” 项目
  • 创建 IMyService 的实现类 CnService
    1. using SampleService;
    2. namespace SampleServiceImpl1
    3. {
    4.         public class CnService : IMyService
    5.         {
    6.                 public void SayHello()
    7.                 {
    8.                         Console.WriteLine("你好");
    9.                 }
    10.         }
    11. }
    复制代码
  • 引用 Nuget 包 Zack.Commons
  • 创建Zack.Commons中的 IModuleInitializer 接口的实现类 ModuleInitializer
    1. using Microsoft.Extensions.DependencyInjection;
    2. using Zack.Commons;
    3. using SampleServiceImpl1;
    4. using SampleService;
    5. class ModuleInitializer : IModuleInitializer
    6. {
    7.         public void Initialize(IServiceCollection services)
    8.         {
    9.                 // 把 CnService 注册为 IMyService 的实现服务
    10.                 services.AddScoped<IMyService, CnService>();
    11.         }
    12. }
    复制代码
  • 创建类库项目 "SampleServiceImpl2” ,重复 3~6 步骤,注意差别的代码:

    • IMyService 的实现类 EnService
      1. using SampleService;
      2. namespace SampleServiceImpl2
      3. {
      4.         public class EnService : IMyService
      5.         {
      6.                 public void SayHello()
      7.                 {
      8.                         Console.WriteLine("Hello");
      9.                 }
      10.         }
      11. }
      复制代码
    • IModuleInitializer 接口的实现类 ModuleInitializer
      1. using Microsoft.Extensions.DependencyInjection;
      2. using Zack.Commons;
      3. using SampleServiceImpl2;
      4. using SampleService;
      5. class ModuleInitializer : IModuleInitializer
      6. {
      7.         public void Initialize(IServiceCollection services)
      8.         {
      9.                 // 把 EnService 注册为 IMyService 的实现服务
      10.                 services.AddScoped<IMyService, EnService>();
      11.         }
      12. }
      复制代码

  • 创建控制台项目 "MainProject”
  • 引用 "SampleService” , "SampleServiceImpl1” , "SampleServiceImpl2”  这三个项目
  • 引用 Nuget 包 Microsoft.Extensions.DependencyInjection
  • 打开 Program.cs,编写服务注册和使用代码(重点看解释
    1. using Microsoft.Extensions.DependencyInjection;
    2. using SampleService;
    3. using Zack.Commons;
    4. // 1.创建服务注册容器
    5. ServiceCollection services=new ServiceCollection();
    6. // 2.调用 GetAllReferencedAssemblies 方法获取所有的用户程序集
    7. var assemblies = ReflectionHelper.GetAllReferencedAssemblies();
    8. // 3.调用 RunModuleInitializers 方法扫描指定程序集中所有实现了 IModuleInitializer 接口的类
    9. //   并且调用它们的Initialize方法来完成服务的注册
    10. services.RunModuleInitializers(assemblies);
    11. // 4.使用
    12. using var sp = services.BuildServiceProvider();
    13. var items = sp.GetServices<IMyService>();
    14. foreach (var item in items)
    15. {
    16.         item?.SayHello();
    17. }
    复制代码
总结

控制台项目 "MainProject” 只是添加了对 "SampleServiceImpl1” 和 "SampleServiceImpl2” 的引用,
但是在项目 "MainProject” 中并没有使用代码注册 CnService 服务和 EnService 服务,服务的注册工作是由 "SampleServiceImpl1” 中的 ModuleInitializer 类完成的。
这样,我们就减小了项目之间的耦合度,实现了步伐集的 "服务注册自治”
往期出色



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表