gpt4 book ai didi

一种方便快捷的服务注册方案

转载 作者:我是一只小鸟 更新时间:2023-08-19 21:57:03 35 4
gpt4 key购买 nike

前言

随着dotnet的发展,DependencyInjection已经成为基础库的一部分,现在我们的很多新型应用程序很自然地应用了DependencyInjection功能。应用功能越多,往往服务类型数量也随着增加,如果依靠手写代码一个服务一个服务地进行注册则非常麻烦。如果使用特性标记服务,在运行时反射扫描服务并注册服务,不但会增加服务的启动时间,同时在AOT裁剪环境下服务类型由于没有显式的被使用而编译时默认被裁剪掉,从而表现为没有可注册的服务.

方案设计

Annotation + SourceGenerator一种理解的方案,它仍然使用特性来标记服务,不同的是它在编译时使用SourceGenerator技术收集程序集里标记的服务类型,然后在集程序集里增加向DependencyInjection注册所有标记的服务的扩展方法代码.

经过SourceGenerator之后,和手写代码一个服务一个服务的注册的效果是完全一样的,最终程序在运行时,不再需要反射程序集扫描服务类型,启动速度会更快一丢丢。同时由于这些服务类型都是显式的被调用,所以也适用于AOT裁剪的项目环境,不再担心服务类型默认被裁剪掉.

方案实现

DependencyInjection.Annotation 这是我对上述方案的一种实现,它开源在github上,支持一个实现对应一种或(最)多(6)种服务类型,使用方式也非常简单.

1 nuget引用

                        
                          <PackageReference Include="DependencyInjection.Annotation" Version="1.0.0" />

                        
                      

2 服务标记

                        
                          // 服务类型为MyService自身
[Service(ServiceLifetime.Singleton)]
class MyService 
{    
}

                        
                      
                        
                          // 服务类型为IMyService1
[Service(ServiceLifetime.Singleton, typeof(IMyService1))]
class MyService : IMyService1
{    
}

                        
                      
                        
                          // 服务类型为IMyService1和IMyService2
[Service(ServiceLifetime.Singleton, typeof(IMyService1), typeof(IMyService2))]
class MyService : IMyService1, IMyService2, IDisposable
{    
}

                        
                      

3 服务注册

                        
                          builder.Services.Add{AssemblyName}();

                        
                      

其中{AssemblyName}为包含服务的程序集名.

最后此篇关于一种方便快捷的服务注册方案的文章就讲到这里了,如果你想了解更多关于一种方便快捷的服务注册方案的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com