如何注册具有多个接口的服务并将该服务用作ConfigureServices .Net Core 3.1中的单个实例

swa*_*eph 4 c# asp.net-core

我有实现多个接口的服务;例如

ServiceClass : IService1, IService2
{
// implementation
}
Run Code Online (Sandbox Code Playgroud)

现在我需要在 ConfigureServices() 中注册此服务,这样我就有一个 SerivceClass 实例,并且即使通过构造函数注入 IService1 或 IService2 也可以使用该实例。对于前,

public class SomeClass1: ISomeClass1
    {
      SomeClass1(IService1 service)
          {
           ...
          }
    }

public class SomeClass2 : SomeClass2
    {
      SomeClass2(IService2 service)
          {
           ...
          }
    }
Run Code Online (Sandbox Code Playgroud)

我尝试使用它的两个接口在ConfigureServices()中注册ServiceClass,但它会创建多个实例。

ConfigureServices(){

...
services.AddSingleton<IService1, ServiceClass>();
services.AddSingleton<IService2, ServiceClass>();
services.AddSingleton<ISomeClass1>(
                x => new SomeClass1(
                    x.GetRequiredService<IService1>(),
                    ));

services.AddSingleton<ISomeClass2>(
                x => new SomeClass2(
                    x.GetRequiredService<IService2>(),
                    )); 
....
}
Run Code Online (Sandbox Code Playgroud)

我需要找到一个解决方案,即使注入的接口不同,我也可以将相同的实例注入 SomeClass1 和 SomeClass2 。

Mar*_*llo 13

解决此问题的一种方法是注册实现类,然后从中显式解析多个接口:

services.AddSingleton<ServiceClass>();
services.AddSingleton<IService1, ServiceClass>(x => x.GetRequiredService<ServiceClass>());
services.AddSingleton<IService2, ServiceClass>(x => x.GetRequiredService<ServiceClass>());
Run Code Online (Sandbox Code Playgroud)

例如,这里有一个针对HttpClientFactory使用此方法的示例。