2017년 12월 20일 수요일

Zenject 의 Inject Binding 방식들 몇가지 메모


// string타입값이 필요할때  생성된 string 인스턴스 "Hello World!" 할당하도록 합니다.
// 적용 대상의 타입은 Greeter로 한정
Container.Bind<string>().FromInstance("Hello World!")
    .When(context => context.ObjectType == typeof(Greeter));

// AsTransient모든 객체 요청이 있을때마다 재활용 없이 인스턴스를 생성하도록 합니다. 
// Inject어트리뷰트에 적용된 아이디가 다음과 같은 경우 > [Inject(Id = "Transient")]
Container.Bind<Dummy>().WithId("Transient").AsTransient();

// AsCached를 사용하는 경우 적용 대상의 타입/조건에 따라 캐쉬된 인스턴스가 사용됩니다.
// When조건이나 WithID조건 있으면 동일한 조건상에서는 같은 인스턴스가 사용됩니다.
// Inject어트리뷰트에 적용된 아이디가 다음과 같은 경우 > [Inject(Id = "Cached")]
Container.Bind<Dummy>().WithId("Cached").AsCached();

// AsSingle는 항상 한개의 인스턴스만 사용합니다.
// AsCached처럼 When조건이나 WithID조건에 따라 다른 인스턴스를 생성하지 않습니다. 싱클톤 패턴에 적합
// Inject어트리뷰트에 적용된 아이디가 다음과 같은 경우 > [Inject(Id = "Single")]
Container.Bind<Dummy>().WithId("Single").AsSingle();


// WithID의 전달 값은 string타입이 일반적이지만 enum을 사용할 수도 있습니다.

/* enum AsScope
   {
      Transient,
      Cached,
      Single,
   }*/
  
Container.Bind<Dummy>().WithId(AsScope.Transient).AsSingle();


// Greeter클래스가 인젝션될  있도록 컨테이너에 바인딩해놓습니다.
// 싱글인스턴스로(AsSingle), 필요할 때가 아닌 즉시 생성(NonLazy)
Container.Bind<Greeter>().AsSingle().NonLazy();

// 초기화 함수가 필요한경우 IInitializable인터페이스를 사용하여 바인딩합니다.
// 값을 인젝션하는 순서는 생성자 > 인젝션 필드 > IInitializable.Initialize 함수순입니다.
Container.Bind<IInitializable>().To<GreeterInit>().AsSingle().NonLazy();

// 앱이 닫힐 때나 장면이 전환될때  객체가 파괴될   정리할 외부 리소스가 존재할 경우 IDisposable를 바인딩 해줄  있다.
Container.Bind<IDisposable>().To<GreeterInit>().AsSingle().NonLazy();


// IWeapon인터페이스에 대한 객체가 필요할때 Weapon클래스 인스턴스를 할당하도록 합니다.
// 적용 대상의 타입은 Player로 한정합니다.
Container.Bind<IWeapon>()
    .To<Weapon>()
    .AsCached()
    .When(context => context.ObjectType == typeof(Player));

// Zenject내에 제공되는 Factory기능을 이용하여 DI형태의 팩토리를 만들  있습니다.
// cubePrefab 프리팹을 기반으로 Cube.Factory클래스를 사용하여 Cube를 생성하도록 합니다.
Container.BindFactory<Cube, Cube.Factory>().FromComponentInNewPrefab(cubePrefab);


// ITickable를 사용하는 InstancingManager클래스에 매프레임 마다 Tick함수를 호출해 주도록 합니다.
// MonoBehaviour의 Update함수 대응
Container.Bind<ITickable>().To<InstancingManager>().AsSingle();

// MonoBehaviour의 FixedUpdate함수 대응
Container.Bind<IFixedTickable>().To<InstancingManager>().AsSingle();

// MonoBehaviour의 LateUpdate함수 대응
Container.Bind<ILateTickable>().To<InstancingManager>().AsSingle();

Container.Bind<InstancingManager>().AsSingle();

댓글 없음:

댓글 쓰기