TypeDataCache
해당 스크립트 파일은 커스텀을 권장드리지 않습니다
TypeDataCache는 [GlobalInject] / [SceneInject] 메타데이터와 Setter,
[InjectConstructor] 관련 정보를 타입별로 캐싱하는 정적 헬퍼입니다.
런타임에서 직접 생성할 필요 없이 전부 정적 API입니다.
CachedInjectField
필드 하나당 다음을 묶습니다.
-
Name,FieldType,Optional,Id(Named 바인딩; 비어 있으면 무키) -
Setter:(object target, object value)— 플랜이면 Roslyn이 넣은 대리, 폴백이면 Expression/SetValue에서 만든 것
주입 루프는 리플렉션으로 필드를 찾지 않고 이 Setter만 호출합니다.
캐시 계층
| 저장소 | 내용 |
|---|---|
_generatedGlobalCache / _generatedSceneCache | Roslyn RegisterGeneratedGlobalFields / RegisterGeneratedSceneFields 로 들어온 리스트 |
_globalInjectCache / _sceneInjectCache | 플랜이 없을 때 리플렉션으로 만든 리스트(세터 포함) |
_constructorCache | GetInjectableConstructor 결과; null 도 캐시해 “주입 불가” 재탐색 방지 |
_generatedFactoryCache | RegisterGeneratedFactory / TryGetGeneratedFactory |
_noInjectTypes | HasAnyInjectField 음성 캐시 |
조회 우선순위(필드): 생성 플랜 → 폴백 캐시 → 첫 빌드 후 캐시 저장.
HasAnyInjectField
[GlobalInject] 또는 [SceneInject] 필드가 하나라도 있으면 true.
[Inject]만 있는 타입은 false이며, 음성 타입은 _noInjectTypes 에 넣어 다음부터 즉시 false.
Warmup / Warmup(params Type[])
지정 타입에 대해 GetGlobalInjectFields, GetSceneInjectFields, GetInjectableConstructor 를 미리 호출해 캐시를 채웁니다.
-
생성 플랜이 이미 있는 타입에서는 사실상 무비용에 가깝습니다.
-
로딩 직후 스파이크를 줄이고 싶을 때 알려진 타입 묶음에 대해 호출하는 용도입니다.
스레드·도메인
- 캐시 딕셔너리는 잠금 없음. 주석상 Unity 메인 스레드 전용,
제너레이터 정적 초기화·RuntimeInitializeOnLoad도 메인 스레드라는 전제입니다.
외부 스레드를 활용하지 마십시오. 안전성이 극도로 낮아집니다.
SubsystemRegistration에서 모든 정적 캐시 클리어 — 도메인 리로드 관련 오염 방지.
공개 진단 헬퍼
에디터·그래프 등에서 쓰는 HasGeneratedGlobalPlan / HasGeneratedScenePlan / HasGeneratedFactory 는
“이 타입이 제너레이터 경로에 올라왔는지”를 빠르게 볼 때 사용합니다.
사용자가 직접 부르지 않는 API
RegisterGenerated* 계열은 EditorBrowsable(Never) 로 소스 제너레이터 전용입니다.
게임 코드에서 호출할 대상이 아닙니다.