2using System.Collections.Generic;
4using System.Reflection;
14 private static readonly Dictionary<Type, Func<object>>
_map =
new();
22 public static void Register<T>(Func<T> factory) where T :
class
23 =>
_map[typeof(T)] = () => factory();
31 =>
_map[typeof(T)] = () => instance;
41 if (
_map.TryGetValue(typeof(T), out var factory))
43 throw new InvalidOperationException($
"[{typeof(T).Name}] 등록되지 않음.");
54 if (
_map.TryGetValue(type, out var factory))
58 if (!type.IsAbstract && type.IsClass)
60 var ctor = type.GetConstructors()
61 .OrderByDescending(c => c.GetParameters().Length)
66 var args = ctor.GetParameters()
67 .Select(p =>
Resolve(p.ParameterType))
69 var instance = Activator.CreateInstance(type, args)!;
72 _map[type] = () => instance;
78 throw new InvalidOperationException($
"[{type.FullName}] 등록되지 않았고, 생성도 불가능합니다.");
89 var assemblies = AppDomain.CurrentDomain.GetAssemblies()
90 .Where(a => !a.IsDynamic && !
string.IsNullOrEmpty(a.FullName))
91 .Prepend(rootAssembly)
94 foreach (var assembly
in assemblies)
98 if (!type.IsClass || type.IsAbstract || type.IsGenericType)
101 var name = type.Name;
105 name.EndsWith(
"Model") ||
106 name.EndsWith(
"Event") ||
107 name.EndsWith(
"Manager") ||
108 name.EndsWith(
"ViewModel") ||
109 name.Contains(
".xaml.ViewModel") ||
110 name.Contains(
".xaml.Model") ||
111 name.Contains(
".xaml.Event") ;
116 if (
_map.ContainsKey(type))
120 var ctor = type.GetConstructors()
121 .OrderByDescending(c => c.GetParameters().Length)
127 if (type.GetConstructor(Type.EmptyTypes) !=
null)
129 _map[type] = () => Activator.CreateInstance(type)!;
139 var args = ctor.GetParameters()
140 .Select(p =>
Resolve(p.ParameterType))
142 var instance = Activator.CreateInstance(type, args)!;
160 return assembly.GetTypes();
162 catch (ReflectionTypeLoadException ex)
164 return ex.Types.Where(t => t !=
null)!;
📦 Dreamine 전용 DI 컨테이너 클래스입니다. 타입별 팩토리 등록, 싱글턴 등록, 자동 등록, 생성자 기반 DI 등을 지원합니다.
static void RegisterSingleton< T >(T instance)
주어진 싱글턴 인스턴스를 타입 T로 등록합니다.
static readonly Dictionary< Type, object > _singletonCache
static readonly Dictionary< Type, Func< object > > _map
static void AutoRegisterAll(Assembly rootAssembly)
주어진 어셈블리 및 현재 AppDomain 내 어셈블리에서 Model, Event, Manager, ViewModel, View 타입들을 자동 등록합니다.
static T Resolve< T >()
타입 T의 인스턴스를 Resolve합니다. 등록된 팩토리를 통해 생성하며, 없을 경우 예외를 발생시킵니다.
static void Register< T >(Func< T > factory)
주어진 타입 T에 대한 팩토리 함수를 등록합니다.
static IEnumerable< Type > SafeGetTypes(Assembly assembly)
어셈블리 로드 오류 발생 시에도 가능한 타입을 반환하는 안전한 GetTypes
static object Resolve(Type type)
주어진 타입 인스턴스를 Resolve합니다. 등록되지 않은 경우 생성자 기반 자동 생성도 시도합니다.