재우니의 블로그

 

 

 

dependency injection 을 할 때 인터페이스의 구현이 달라서 특정 구현을 해결해야 하는 경우가 종종 있습니다.

이제 ASP.NET Core 8.0에서  Keyed Services 를 지원합니다.

다음 인터페이스와 그 구현을 고려해 보세요.

 

public interface IMyService
{
    string GetValue();
}
 
public class MyService1 : IMyService
{
    public string GetValue() => "MyService1";
}
 
public class MyService2 : IMyService
{
    public string GetValue() => "MyService2";
}

 

이제 다음과 같이 이러한 서비스를 key 명칭으로 등록할 수 있습니다

WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
 
builder.Services.AddKeyedScoped<IMyService, MyService1>("service1");
builder.Services.AddKeyedScoped<IMyService, MyService2>("service2");

 

다른 lifetimes  (Transient, Singleton) 에도 Keyed services  를 등록할 수 있습니다.
 

이제 [FromKeyedServices] 속성을 사용하여 키별로 특정 구현을 확인할 수 있습니다.

 

생성자에서 구현하는 방법은 아래와 같습니다.

// Note:
//    I am using Primary Constructor which is new with .NET 8.0
//    You can use the other constructor as well
public class MyClass([FromKeyedServices("service1")] IMyService myService)
{
    public string GetValue() => myService.GetValue();
}
 

 

endpoint 에서도 key 명칭을 통해 구현 가능합니다.

app.MapGet("/", ([FromKeyedServices("service2")] IMyService myService) =>
{
    return myService.GetValue();
});