### **VContainer + UniRx**
- **UniRx란?**
- Unity에 최적화된 Rx(Reactive Extensions) 라이브러리입니다.
- 이벤트, 비동기 작업, 데이터 스트림 등을 관찰 가능한(Observable) 시퀀스로 추상화하여, 선언적이고 조합 가능한 방식으로 처리할 수 있게 합니다.
- **VContainer 진입점과 UniRx의 결합:**
- 문서는 `IDisposable` 인터페이스를 구현하는 VContainer의 진입점(Entry Point)과 UniRx의 `CompositeDisposable`을 함께 사용하는 예시를 보여줍니다.
- `CompositeDisposable`은 여러 `IDisposable` 객체를 한 번에 관리하고 폐기(Dispose)할 수 있게 해주는 UniRx의 유틸리티 클래스입니다.
**기본 예시:**
C#
```
public class FooController : IStartable, IDisposable
{
// CompositeDisposable을 사용하여 여러 IDisposable 객체를 관리
readonly CompositeDisposable disposable = new CompositeDisposable();
void IStartable.Start()
{
// fooObservable은 어떤 Observable<T> 타입이라고 가정
fooObservable
.Subscribe(_ => /* Do something */) // Observable 구독
.AddTo(disposable); // 구독된 IDisposable을 CompositeDisposable에 추가
}
void IDisposable.Dispose()
{
// LifetimeScope가 폐기될 때 CompositeDisposable 내부의 모든 IDisposable을 폐기
disposable.Dispose();
}
}
```
- **설명:**
- `FooController`는 `IStartable` (VContainer 진입점)과 `IDisposable`을 모두 구현합니다.
- `IStartable.Start()` 메서드에서 `fooObservable`을 구독하고, 이 구독으로 반환되는 `IDisposable` 객체를 `CompositeDisposable`에 추가합니다.
- `IDisposable.Dispose()` 메서드에서는 `disposable.Dispose()`를 호출하여 `CompositeDisposable`에 추가된 모든 구독 및 리소스를 한 번에 해제합니다.
- 이러한 패턴은 `FooController` (또는 이를 포함하는 `LifetimeScope`)의 생명주기와 UniRx 구독의 생명주기를 연동하여, 객체가 더 이상 필요 없을 때 메모리 누수를 방지하는 데 매우 효과적입니다.
**확장 메서드를 통한 간결한 구문 (AddTo(this)):**
- 문서는 `AddTo(this)`와 같은 단축 구문을 사용할 수 있도록 `ControllerBase`라는 기본 클래스와 `DisposableExtensions`라는 확장 메서드를 제안합니다.
<!-- end list -->
C#
```
// 컨트롤러 베이스 클래스
public class ControllerBase : IDisposable
{
readonly CompositeDisposable disposable = new CompositeDisposable();
void IDisposable.Dispose() => disposable.Dispose();
// IDisposable 아이템을 CompositeDisposable에 추가하는 헬퍼 메서드
public void AddDisposable(IDisposable item)
{
disposable.Add(item);
}
}
// 확장 메서드
public static class DisposableExtensions
{
public static T AddTo<T>(this T disposable, ControllerBase controller)
where T : IDisposable
{
controller.AddDisposable(disposable);
return disposable;
}
}
```
- **사용 예시:**
C#
```
public class FooController : ControllerBase, IStartable // ControllerBase 상속
{
void IStartable.Start()
{
someObservable
.Subscribe(...)
.AddTo(this); // 간결하게 현재 컨트롤러의 CompositeDisposable에 추가
}
}
```
- **설명:** `ControllerBase`를 상속하고 `AddTo` 확장 메서드를 사용하면, `UniRx`의 `IDisposable` 객체를 `this` (현재 컨트롤러 인스턴스)에 간편하게 추가하여 관리할 수 있습니다. 이는 코드를 더 깔끔하고 읽기 쉽게 만듭니다.
### 요약
VContainer의 진입점과 UniRx를 함께 사용하여 반응형 프로그래밍 패턴을 구현하는 방법을 제시합니다. `IStartable` 및 `IDisposable` 인터페이스를 통해 VContainer의 생명주기에 UniRx 구독을 통합하고, `CompositeDisposable`을 활용하여 효율적인 리소스 관리를 수행하는 방법을 설명합니다. 또한, `AddTo(this)`와 같은 확장 메서드를 통해 코드의 가독성과 유지보수성을 높이는 팁을 제공합니다.
---
이전 : [[5.2 UniTask]] | 다음 : [[5.4 MessagePipe]]