首页 > 其他分享 >.net core中实现服务自动发现

.net core中实现服务自动发现

时间:2023-11-29 20:12:00浏览次数:30  
标签:core assembly 程序 classes 自动 AddClasses net

.net core中自带了依赖注入框架,asp.net core或worker框架下可以直接使用, 控制台程序可以通过加入Microsoft.Extensions.DependencyInjection程序包来支持。自带的di框架功能还行, 但是一个不方便的地方是没有提供服务自动发现、注册的接口,稍微大的程序都是需要通过反射自己写一个发现程序的。

今天网上找到了一个第三方实现的服务发现的库Scrutor,还比较好用, 示例如下:

var collection = new ServiceCollection();

collection.Scan(scan => scan
     // We start out with all types in the assembly of ITransientService
    .FromAssemblyOf<ITransientService>()
        // AddClasses starts out with all public, non-abstract types in this assembly.
        // These types are then filtered by the delegate passed to the method.
        // In this case, we filter out only the classes that are assignable to ITransientService.
        .AddClasses(classes => classes.AssignableTo<ITransientService>())
            // We then specify what type we want to register these classes as.
            // In this case, we want to register the types as all of its implemented interfaces.
            // So if a type implements 3 interfaces; A, B, C, we'd end up with three separate registrations.
            .AsImplementedInterfaces()
            // And lastly, we specify the lifetime of these registrations.
            .WithTransientLifetime()
        // Here we start again, with a new full set of classes from the assembly above.
        // This time, filtering out only the classes assignable to IScopedService.
        .AddClasses(classes => classes.AssignableTo<IScopedService>())
            // Now, we just want to register these types as a single interface, IScopedService.
            .As<IScopedService>()
            // And again, just specify the lifetime.
            .WithScopedLifetime()
        // Generic interfaces are also supported too, e.g. public interface IOpenGeneric<T> 
        .AddClasses(classes => classes.AssignableTo(typeof(IOpenGeneric<>)))
            .AsImplementedInterfaces()
        // And you scan generics with multiple type parameters too
        // e.g. public interface IQueryHandler<TQuery, TResult>
        .AddClasses(classes => classes.AssignableTo(typeof(IQueryHandler<,>)))
            .AsImplementedInterfaces());

这个类本身是比较好用的,但是它仍需要手工制定程序集作为扫描范围。 这个程序集的范围并不是所有程序集,往往只有用户代码程序集, asp.net core程序内部是有这个功能的,例如它内部就能扫描所有用户程序集,生成ApiController,网上搜了一下,发现还是一个内部接口,不过可以通过反射来调用:

	public static Assembly[] GetAssemblies()
	{
		var manager = new ApplicationPartManager();

		var method = manager.GetType()
		                    .GetMethod("PopulateDefaultParts",
			                     BindingFlags.NonPublic | BindingFlags.Instance);


		//加载入口程序集的依赖项树中的所有非官方包的依赖程序集
		var assembly = Assembly.GetEntryAssembly().FullName;
		method.Invoke(manager, new object[] { assembly });

		return manager.ApplicationParts.OfType<AssemblyPart>().Select(i => i.Assembly).ToArray();
	}

 

标签:core,assembly,程序,classes,自动,AddClasses,net
From: https://www.cnblogs.com/TianFang/p/17865748.html

相关文章

  • .NET 6 新东西 --PeriodicTimer
    在.NET6中引入了新Timer:System.Threading.PeriodicTimer,它和之前的Timer相比,最大的区别就是新的PeriodicTimer事件处理可以方便地使用异步,消除使用callback机制减少使用复杂度。讲解PeriodicTimer之前我们先来看以下该怎么使用它:usingvarcts=newCancellationTok......
  • 开源的.NET混淆工具使用
    一、ConfuserExhttps://github.com/mkaring/ConfuserEx使用方法:1、到Releases中下载最新的GUI包 2、解压后,打开ConfuserEx.exe,进入程序主页,再点击画圈的“+”按钮,选择要混淆的dll文件3、切换到“Setting”标签,选中dll后点击右边的“+”按钮,给它添加一条“true”规则 4......
  • Kubernetes网络
    在Kubernetes(k8s)中,网络主要由以下几部分组成:Pod网络:Pod是k8s中的基本工作单元,可以容纳一个或多个应用程序容器。为了使Pod之间能够通信,k8s提供了一个名为CNI(ContainerNetworkInterface)的网络抽象层。CNI允许第三方网络插件与k8s集成,为Pod创建和管理网络。最常见的网络插件包括Fla......
  • 脸书自动关注机器人
    《脸书自动关注机器人:社交媒体的新挑战》 随着社交媒体的普及,人们对于如何增加关注者数量和提升社交媒体影响力的需求日益增加。在这种情况下,一些用户开始寻求利用自动关注机器人来快速增加他们的关注者数量。尤其是在脸书(Facebook)这样庞大的社交平台上,自动关注机器人的出现引......
  • 【转】如何给 Visual Studio 2022 安装 .NET 4.5 开发者工具包?
    本文转自:https://www.coderbusy.com/archives/2913.html在VS2022打开.net4.5的项目时,可能会遇到编译报错:ErrorMSB3644Thereferenceassembliesfor.NETFramework,Version=v4.5werenotfound.Toresolvethis,installtheDeveloperPack(SDK/TargetingPack)for......
  • win7系统安装mysql及问题处理,安装mysql后net start mysql服务无法启动
    问题描述:win7系统安装mysql,安装mysql后netstartmysql服务无法启动1.下载mysql:官网地址:https://dev.mysql.com/downloads/mysql/根据自身系统位数选择对应版本下载,解压后进入bin文件夹,cmd命令下执行mysqld-install (需要配置path的可自行进行搜索)安装成功后再执行netsta......
  • NET 6 WebAPI 如何接受微信支付回调
    [HttpPost("WxNotify")]publicasyncTaskWxNotify(){HttpContextAccessorcontext=new();varrequest=context.HttpContext?.Request;if(request!=null){varbuffer=newMemoryStream();awaitrequest.Body.Co......
  • NET 元组(Tuple)数据结构
    .NET中的元组(Tuple)是一种数据结构,用于将多个不同类型的值组合成单个复合值。这使得你可以在没有创建专门的类或结构体的情况下,从方法中返回多个值,或者在多个部分之间传递一组值。.NET提供了两种主要的元组类型:System.Tuple类这是.NETFramework4.0中引入的早期元组类型。......
  • 通过Java-Netty实现一个简单的HTML实时聊天——demo
    demo效果初步准备想要实现聊天就需要用到WebSocket,他是专门用于http进行实时聊天的的协议。因为主要核心在后端开发,所以我去白嫖了个超级简单的界面(就是不会!)我编写demo时系统环境为Win-11,Java-8环境依赖只需要一个netty即可实现需要的功能<!--netty--><dependency><g......
  • CSPNet跨阶段局部网络方法
    CSPNet跨阶段局部网络方法目录CSPNet跨阶段局部网络方法背景和问题主要解决问题网络结构特征融合策略CSPnet代码结构参考资料论文地址:https://arxiv.org/pdf/1911.11929.pdf背景和问题随着卷积神经网络结构变得更深更宽,扩展神经网络的体系结构通常会带来更多的计算轻量级网......