Asp.net Core 2.0条件DI

时间:2019-03-22 13:34:38

标签: asp.net-core-2.0

我有一个具有2个实现的接口 IMY服务 我的服务 MYServiceB

此处,实现取决于服务构造者使用的请求标头中的某些数据,例如 如果Header具有internalId的值,则使用MyServiceA并将该ID传递给构造函数中的服务 而如果缺少该值,请使用MyServiceB,因为此服务构造不希望使用id。

使用IMyservice的DI定义了我的控制器

1 个答案:

答案 0 :(得分:0)

通常,您需要一家工厂。通常,这是一个单独的类,负责管理某种特定类型的事物的实例,并根据某种约定或条件返回适当的实例。例如,如果您使用过IHttpClientFactory,那么您将看到一个正在运行的东西。

由于实现取决于请求,因此可以使用AddScoped的“工厂”重载来作弊:

services.AddScoped<IMyService>(p => 
{
    // return either MyServiceA or MyServiceB
});

lambda的p参数实际上是IServiceProvider的作用域实例,因此您可以执行诸如拉出IHttpContextAccessor来查看请求详细信息之类的事情。