1using Dreamine.MVVM.Interfaces.Locators;
3using System.Diagnostics;
4using System.Reflection;
16 private static readonly Dictionary<Type, Type>
_map =
new();
23 public static void Register(Type viewType, Type viewModelType)
25 if (!
_map.ContainsKey(viewType))
26 _map[viewType] = viewModelType;
44 public static object?
Resolve(Type viewType)
46 if (
_map.TryGetValue(viewType, out var mappedType))
48 return _resolver?.Resolve(mappedType) ?? Activator.CreateInstance(mappedType);
51 var viewName = viewType.FullName;
55 var
asm = viewType.Assembly.FullName;
58 if (!viewName.Contains(
".Views."))
62 var viewModelName = viewName.Replace(
".Views.",
".ViewModels.") +
"ViewModel";
64 var vmType = Type.GetType($
"{viewModelName}, {asm}");
66 ?
_resolver?.Resolve(vmType) ?? Activator.CreateInstance(vmType)
78 if (viewModelType ==
null)
return null;
81 string? viewTypeName = viewModelType.FullName?
82 .Replace(
".ViewModels.",
".Views.")
83 .Replace(
"ViewModel",
"View");
85 if (viewTypeName ==
null)
return null;
88 var viewType = viewModelType.Assembly.GetType(viewTypeName);
93 viewType = AppDomain.CurrentDomain.GetAssemblies()
94 .Where(a => !a.IsDynamic)
95 .Select(a => a.GetType(viewTypeName ??
""))
96 .FirstOrDefault(t => t !=
null);
99 return viewType !=
null
100 ? Activator.CreateInstance(viewType)
114 var viewTypes = assembly.GetTypes()
115 .Where(t => t.IsClass && !t.IsAbstract &&
116 (t.Namespace?.Contains(
".Views") ==
true || t.Namespace?.Contains(
".Pages") ==
true));
118 var allTypes = assembly.GetTypes()
119 .Where(t => t.IsClass && !t.IsAbstract);
121 foreach (var viewType
in viewTypes)
123 var viewName = viewType.Name;
124 var viewNs = viewType.Namespace ??
"";
126 var candidateNames =
new[]
128 viewName +
"ViewModel",
129 viewName +
".ViewModel",
130 viewName +
"_ViewModel",
133 var candidateNamespaces =
new[]
135 viewNs.Replace(
".Views",
".ViewModels"),
136 viewNs.Replace(
".Pages",
".ViewModels"),
140 foreach (var ns
in candidateNamespaces)
142 foreach (var name
in candidateNames)
144 var fullName = $
"{ns}.{name}";
145 var vmType = allTypes.FirstOrDefault(t => t.FullName == fullName);
View โ ViewModel ์๋ ์ฐ๊ฒฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, DI Container ์ฐ๋์ ์ํ Resolver ์ ๋ต๋ ์ง์ํฉ๋๋ค.
static readonly Dictionary< Type, Type > _map
static void Register(Type viewType, Type viewModelType)
View โ ViewModel ํ์
๋งคํ์ ์๋ ๋ฑ๋กํฉ๋๋ค.
static ? object Resolve(Type viewType)
View ํ์
์ ๊ธฐ๋ฐ์ผ๋ก ViewModel ์ธ์คํด์ค๋ฅผ ๋ฐํํฉ๋๋ค. DI Resolver๊ฐ ๋ฑ๋ก๋์ด ์์ผ๋ฉด ์ฐ์ ์ฌ์ฉํ๋ฉฐ, ์์ ๊ฒฝ์ฐ ๊ท์น ๊ธฐ๋ฐ ์์ฑ ์ํ
static ? object ResolveView(Type viewModelType)
ViewModel ํ์
์ ๋์ํ๋ View ์ธ์คํด์ค๋ฅผ ๋ฐํํฉ๋๋ค. ViewModel ๋ช
๋ช
๊ท์น์ 'XxxViewModel' โ 'XxxView' ๋๋ 'Xxx' ์
๋๋ค.
static void RegisterResolver(IViewModelResolver resolver)
์ธ๋ถ DI Resolver๋ฅผ ๋ฑ๋กํฉ๋๋ค.
static ? IViewModelResolver _resolver
static void RegisterAll(Assembly assembly)
์ฃผ์ด์ง ์ด์
๋ธ๋ฆฌ์์ View โ ViewModel ๋งคํ์ ์๋ ๋ฑ๋กํฉ๋๋ค. ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๋ฐ๋ฆ
๋๋ค: