我有一个具有2个实现的接口 IMY服务 我的服务 MYServiceB
此处,实现取决于服务构造者使用的请求标头中的某些数据,例如 如果Header具有internalId的值,则使用MyServiceA并将该ID传递给构造函数中的服务 而如果缺少该值,请使用MyServiceB,因为此服务构造不希望使用id。
使用IMyservice的DI定义了我的控制器
答案 0 :(得分:0)
通常,您需要一家工厂。通常,这是一个单独的类,负责管理某种特定类型的事物的实例,并根据某种约定或条件返回适当的实例。例如,如果您使用过IHttpClientFactory
,那么您将看到一个正在运行的东西。
由于实现取决于请求,因此可以使用AddScoped
的“工厂”重载来作弊:
services.AddScoped<IMyService>(p =>
{
// return either MyServiceA or MyServiceB
});
lambda的p
参数实际上是IServiceProvider
的作用域实例,因此您可以执行诸如拉出IHttpContextAccessor
来查看请求详细信息之类的事情。