ASP.NET Core 기본 주입 방식에서 다중 주입 방법 (여러 방식)

4878 단어 C#.NETCore
우리가 개발하는 과정에서 서비스에 대해 일반적으로 우리가 정의한 interface 실현은 모두 하나의 구체적인 실현만 존재한다(어떤 사람들은 이런 상황을 10세대 단일 전송 모델이라고 놀린다). 이때 코어의 기본적인 주입 방식은 우리의 수요를 지원하지만 일부 추상적인 정의의 실현에 있어 우리는 여러 가지 구체적인 실현이 있을 수 있다. 프로젝트에서우리는 구체적인 수요에 따라 서로 다른 실현을 선택할 수 있다.
먼저 우리의 업무 장면의 예를 구체적으로 살펴보고 다음과 같은 interface와 그 두 가지 구체적인 실현이 있다고 가정하자.
    public interface ILogicService
    {
        int GetNo();
    }

    public class LogicSericeImpt1 : ILogicService
    {
        public int GetNo()
        {
            return 1;
        }
    }
    public class LogicSericeImpt2 : ILogicService
    {
        public int GetNo()
        {
            return 2;
        }
    }

예는 매우 간단하다. 바로 서로 다른 실현이 서로 다른 번호를 되돌려주는 것이다. 다음은 주입된 상황에서 어떻게 서로 다른 실현을 얻을 수 있는지 설명한다.
직접 주입IServiceProvider방식
코어에서IServiceProvider는 구체적인 응용에 직접 주입할 수 있기 때문에 직접적으로IServiceProvider를 통해 구체적인 실현을 얻는 방식이 생겼다.
1. 통과GetService 방식
우선 주입 구체적 실현
services.AddTransient();
services.AddTransient();

그리고 구조 함수에서 다음과 같은 방식으로 구체적인 실현을 얻는다
public TodoController(IServiceProvider serviceProvider)
{
    var s1FromProvider = serviceProvider.GetService();
    var s2FromProvider = serviceProvider.GetService();
}

2.통과GetServices방식
우선 주입interface 및 구체적 실현
services.AddTransient();
services.AddTransient();

그리고 구조 함수에서 다음과 같은 방식으로 구체적인 실현을 얻는다
public TodoController(IServiceProvider serviceProvider)
{
    var logicAllRegs = serviceProvider.GetServices().ToList();
    var s1FromAllRegs = logicAllRegs[0];
    var s2FromAllRegs = logicAllRegs[1];
}

직접 주입 집합 방식
이런 방식은 사실 주입IServiceProvider의 과정을 생략하고 GetServices에서 얻은 결과를 직접 주입하는 것이다.우선 주입interface 및 구체적 실현
services.AddTransient();
services.AddTransient();

그리고 구조 함수에서 다음과 같은 방식으로 구체적인 실현을 얻는다
public TodoController(IEnumerable services)
{
    var s1FromServices = services.First();
    var s2FromServices = services.Skip(1).First();
}

직주입Func공장방식
이런 방식으로 우리는 구체적인 실현에 직접 주입하는 것이 아니라 Func라는 공장에 주입하여 실현했다.일단 저희가 구체적 실현을 주입해야 돼요.
services.AddTransient();
services.AddTransient();

그리고 우리는 계속해서 Func라는 공장에 주입했다. 여기서 우리는 int에 따라 서로 다른 실현을 되돌릴 수 있다. 물론 너도 다른 방식을 사용할 수 있다. 예를 들어string
services.AddSingleton(provider =>
{
    Func<int, ILogicService> func = n =>
    {
        switch (n)
        {
            case 1:
                return provider.GetService();
            case 2:
                return provider.GetService();
            default:
                throw new NotSupportedException();
        }
    };
    return func;
});

그리고 구조 함수에서 다음과 같은 방식으로 구체적인 실현을 얻는다
public TodoController(Func<int, ILogicService> funcFactory)
{
    var s1FromFunc = funcFactory(1);
    var s2FromFunc = funcFactory(2);
}

좋은 웹페이지 즐겨찾기