在我的 AspNetCore 应用程序中,我处理从队列到达的消息。为了处理消息,我需要解析一些服务。其中一些服务依赖于ITenantId,我使用收到的消息中的信息进行绑定。为了解决这个问题,消息的处理从创建一个子容器开始,然后我用它来创建一个IServiceScope,从中解析所有需要的依赖项。
消息可以并行处理,因此作用域必须相互隔离。
我可以看到创建子容器的方法,但我不确定哪种方法在性能、内存更改等方面最好:
选项 A:每次消息到达时,将 IServiceCollection 克隆到新的 ServiceCollection 中,并ITenantId在克隆的实例上重新绑定。
选项 B:当程序启动时,创建 IServiceCollection 的不可变副本(使用ImmutableList<ServiceDescriptor>或ImmutableArray<ServiceDescriptor>)。每次消息到达时,替换ITenantId(产生 的新实例ImmutableList<ServiceDescriptor>)并调用CreateScope()新的不可变实例。
我不喜欢选项 A 的一点是,每次消息到达时都需要克隆整个服务集合。我不确定选项 B 中的不可变集合是否以更智能的方式处理这个问题?
我正在使用VS 2017和.NET Core.使用依赖注入,我想在运行时动态注册我的服务.我的目标是编写我的服务实例,在不同的程序集中实现服务接口.然后将servicename /程序集名称添加到某种配置文件(或db表)中.
我的注册码会做这样的事情:
var ServiceTypeName = LoadServiceAssembly(AssemblyName);
var serviceProvider = new ServiceCollection()
.AddTransient<IDILogger, "ConsoleDILogger">() // <--- Goal
.BuildServiceProvider();
var logger = serviceProvider.GetService(IDILogger);
Run Code Online (Sandbox Code Playgroud)
显然,AddTransient行不起作用,因为这样的方法不存在.然而,它确实描绘了这个想法.我想通过字符串名称注册类型,以便每次添加新服务类型时都不需要重新编译加载器应用程序.
我似乎无法找到如何做到这一点.欢迎大家提出意见.
TIA