相关疑难解决方法(0)

使用 Microsoft.Extensions.DependencyInjection 创建子容器(或隔离范围)的最佳策略

在我的 AspNetCore 应用程序中,我处理从队列到达的消息。为了处理消息,我需要解析一些服务。其中一些服务依赖于ITenantId,我使用收到的消息中的信息进行绑定。为了解决这个问题,消息的处理从创建一个子容器开始,然后我用它来创建一个IServiceScope,从中解析所有需要的依赖项。

消息可以并行处理,因此作用域必须相互隔离。

我可以看到创建子容器的方法,但我不确定哪种方法在性能、内存更改等方面最好:

选项 A:每次消息到达时,将 IServiceCollection 克隆到新的 ServiceCollection 中,并ITenantId在克隆的实例上重新绑定。

选项 B:当程序启动时,创建 IServiceCollection 的不可变副本(使用ImmutableList<ServiceDescriptor>ImmutableArray<ServiceDescriptor>)。每次消息到达时,替换ITenantId(产生 的新实例ImmutableList<ServiceDescriptor>)并调用CreateScope()新的不可变实例。

我不喜欢选项 A 的一点是,每次消息到达时都需要克隆整个服务集合。我不确定选项 B 中的不可变集合是否以更智能的方式处理这个问题?

dependency-injection .net-core asp.net-core

7
推荐指数
1
解决办法
3430
查看次数

C#依赖注入运行时(动态)注册

我正在使用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

c# dependency-injection .net-core

6
推荐指数
2
解决办法
6315
查看次数