Unity/VContainer

유니티를 위한 DI 프레임워크 VContainer, Constructor Injection

VR하는소년 2023. 3. 10. 09:00

일반적으로, 종속성은 처음에 Resovle 될 때 구성되고 주입됩니다

종속성이 필요한 클래스가 등록될 때, 생성자를 제공합니다(매개인자를 받음으로)

class ClassA
{
    readonly IServiceA serviceA;
    readonly IServiceB serviceB;
    readonly SomeUnityComponent component;

    public ClassA(
        IServiceA serviceA,
        IServiceB serviceB,
        SomeUnityComponent component)
    {
        this.serviceA = serviceA;
        this.serviceB = serviceB;
        this.component = component;
    }
}

위 코드처럼, ClassA라는 생성자에 serviceA, serviceB, compoent를 매개인자로 받고 구성합니다

위 코드를 보면 VContainer의 API들이 필요하지 않으므로 관려해서 더이상 VContainer API를 사용하지 않습니다

하지만, ClassA는 원하는 경우 동일 생성자를 수동적으로 인스턴화하여 만들 수 있습니다

 

더보기

[CAUTION]

 

유니티는 빌드 단계에서 불필요한 코드를 제거하니다

종종 reflection 또는 IL코드 생성이 관련될 때 실수가 일어납니다

생성자가 삭제되지 않는 것을 확실하게 하기 위해, [Inject] 속성을 사용하면 됩니다!

함수에도 적용할 수 있습니다!

  [Inject]
    public ClassA(
        IServiceA serviceA,
        IServiceB serviceB,
        SomeUnityComponent component)
    {
        // ...
    }

[NOTE]

하나 이상의 생성자를 가지고 있으면, VContainer는 정확하게 하나의 생성자에만 [Inject]를 정의해야 한다

그러지 않으면 예외처리를 해야 한다, 우선순위를 잘 파악해야한다!


 

[RECOMMENDATION]

생성자와  readonly 필드를 가능한 사용해야한다!

 

 

[Suppressing Warnings]

생성자를 사용할 때, Injection을 사용하지 않을 거면 IDE에다가 마크해줘야한다!

public class Dependency
{
    [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
    public Dependency(GameContext game, StatusContext status)
    {
        _game = game;
    }
}
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]

위 속성을 사용해서 마크해주면 된다!!