ToB企服应用市场:ToB评测及商务社交产业平台
标题:
服务注册自治,降低 ASP.NET Core Web API 依赖注入的耦合度和复杂度
[打印本页]
作者:
大号在练葵花宝典
时间:
2024-11-15 20:24
标题:
服务注册自治,降低 ASP.NET Core Web API 依赖注入的耦合度和复杂度
前言
在软件的实际开发中,一个软件通常由多个项目组成,这些项目都会直接或者间接被主 ASP.NET Core 项目引用。
这些项目中通常都会用到若干个被注入的服务,因此我们需要在主 ASP.NET Core 项目的 Program.cs 中注册这些服务。这样不仅会增加了 Program.cs 管理的复杂度,而且也增加了项目的耦合度。
如果能让各个项目负责各自的服务注册,就可以或许减小项目之间的耦合度。
Step By Step 步骤
创建类库项目 "SampleService”
创建接口IMyService
namespace SampleService
{
public interface IMyService
{
void SayHello();
}
}
复制代码
创建类库项目 "SampleServiceImpl1” ,并引用 "SampleService” 项目
创建 IMyService 的实现类 CnService
using SampleService;
namespace SampleServiceImpl1
{
public class CnService : IMyService
{
public void SayHello()
{
Console.WriteLine("你好");
}
}
}
复制代码
引用 Nuget 包 Zack.Commons
创建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>();
}
}
复制代码
创建类库项目 "SampleServiceImpl2” ,重复 3~6 步骤,注意差别的代码:
IMyService 的实现类 EnService
using SampleService;
namespace SampleServiceImpl2
{
public class EnService : IMyService
{
public void SayHello()
{
Console.WriteLine("Hello");
}
}
}
复制代码
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>();
}
}
复制代码
创建控制台项目 "MainProject”
引用 "SampleService” , "SampleServiceImpl1” , "SampleServiceImpl2” 这三个项目
引用 Nuget 包 Microsoft.Extensions.DependencyInjection
打开 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 类完成的。
这样,我们就减小了项目之间的耦合度,实现了步伐集的 "服务注册自治”
往期出色
C# 静态类,高手不想让你知道的 15 个真相
封装一个 C# 范围判断函数,今后告别重复编写范围判断代码的烦恼
用 C# Stopwatch 计时,让代码性能飞起来!
轻装上阵,Visual Studio LocalDB:.NET 步伐员的本地数据库神器
封装一个C#万能底子数据类型转换器,一招解决全部底子类型转换烦恼
闲话 .NET(7):.NET Core 能镌汰 .NET FrameWork 吗?
常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
C# AutoMapper 10个常用方法总结
C# 7个方法比较两个对象是否相等
C# 去掉字符串最后一个字符的 4 种方法
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4