제가 2년전만 해도 주로 4.7버전 mvc4에서 작업을 했습니다. 그러다 보니 닷넷에서 DI관련 정보를 거의 접하지 못했네요.
3년전에는 스프링부트 2.x를 이용해서 개발 경험이 있었는데 DI를 위한 설정이나 주입법이 다양한 것을 보았습니다.
그래서 닷넷에서 DI는 많이 접하지 못했는데 오늘 새로운 8(9아님)의 새로운 기능을 확인 하다 보니 키 기반 주입 내용이 있더라구요. 반가워서 공유합니다.
버전이 올라가면서 하나하나 추가되다 보니 DI 기능이 어디까지 지원하는지 알 수가 없는데 혹시 관련정보가 모여 있다면 정보 공유 부탁 드립니다.
-정의
키 서비스는 키를 사용하여 DI(종속성 주입) 서비스를 등록하고 검색하는 메커니즘을 나타냅니다. 서비스는 키를 등록하기 위해 호출 AddKeyedSingleton (또는 AddKeyedScoped
AddKeyedTransient
)하여 키와 연결됩니다. 특성을 사용하여 키를 [FromKeyedServices]
지정하여 등록된 서비스에 액세스합니다. 다음 코드는 키 지정된 서비스를 사용하는 방법을 보여 줍니다.
- 대상코드
// ICache 다형성을 부여받은 두개의 서비스 등록
builder.Services.AddKeyedSingleton<ICache, BigCache>("big");
builder.Services.AddKeyedSingleton<ICache, SmallCache>("small");
// 각 엔드포인트 마다 ICache 다형성을 부여받은 선택적 주입
app.MapGet("/big", ([FromKeyedServices("big")] ICache bigCache) => bigCache.Get("date"));
app.MapGet("/small", ([FromKeyedServices("small")] ICache smallCache) =>
smallCache.Get("date"));
- 전체 코드
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddKeyedSingleton<ICache, BigCache>("big");
builder.Services.AddKeyedSingleton<ICache, SmallCache>("small");
builder.Services.AddControllers();
var app = builder.Build();
app.MapGet("/big", ([FromKeyedServices("big")] ICache bigCache) => bigCache.Get("date"));
app.MapGet("/small", ([FromKeyedServices("small")] ICache smallCache) =>
smallCache.Get("date"));
app.MapControllers();
app.Run();
public interface ICache
{
object Get(string key);
}
public class BigCache : ICache
{
public object Get(string key) => $"Resolving {key} from big cache.";
}
public class SmallCache : ICache
{
public object Get(string key) => $"Resolving {key} from small cache.";
}
[ApiController]
[Route("/cache")]
public class CustomServicesApiController : Controller
{
[HttpGet("big-cache")]
public ActionResult<object> GetOk([FromKeyedServices("big")] ICache cache)
{
return cache.Get("data-mvc");
}
}
public class MyHub : Hub
{
public void Method([FromKeyedServices("small")] ICache cache)
{
Console.WriteLine(cache.Get("signalr"));
}
}
- 원문링크