Dreamine.Locators Ver.1.0.4
Loading...
Searching...
No Matches
ViewModelLocator.cs
Go to the documentation of this file.
1using Dreamine.MVVM.Interfaces.Locators;
2using System;
3using System.Diagnostics;
4using System.Reflection;
5using System.Windows;
6
8{
13 public static class ViewModelLocator
14 {
15 private static IViewModelResolver? _resolver;
16 private static readonly Dictionary<Type, Type> _map = new();
17
23 public static void Register(Type viewType, Type viewModelType)
24 {
25 if (!_map.ContainsKey(viewType))
26 _map[viewType] = viewModelType;
27 }
28
33 public static void RegisterResolver(IViewModelResolver resolver)
34 {
35 _resolver = resolver;
36 }
37
44 public static object? Resolve(Type viewType)
45 {
46 if (_map.TryGetValue(viewType, out var mappedType))
47 {
48 return _resolver?.Resolve(mappedType) ?? Activator.CreateInstance(mappedType);
49 }
50
51 var viewName = viewType.FullName;
52 if (viewName == null)
53 return null;
54
55 var asm = viewType.Assembly.FullName;
56
57 // ๐Ÿง  View โ†’ ViewModel ๋งคํ•‘ ๊ทœ์น™: .Views โ†’ .ViewModels, + "ViewModel" suffix
58 if (!viewName.Contains(".Views."))
59 return null;
60
61 // ์˜ˆ: DreamineApp.Views.Login.MainWindow โ†’ DreamineApp.ViewModels.Login.MainWindowViewModel
62 var viewModelName = viewName.Replace(".Views.", ".ViewModels.") + "ViewModel";
63
64 var vmType = Type.GetType($"{viewModelName}, {asm}");
65 return vmType != null
66 ? _resolver?.Resolve(vmType) ?? Activator.CreateInstance(vmType)
67 : null;
68 }
69
76 public static object? ResolveView(Type viewModelType)
77 {
78 if (viewModelType == null) return null;
79
80 // ViewModel ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ View ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์œ ์ถ”
81 string? viewTypeName = viewModelType.FullName?
82 .Replace(".ViewModels.", ".Views.")
83 .Replace("ViewModel", "View");
84
85 if (viewTypeName == null) return null;
86
87 // ViewModel๊ณผ ๋™์ผ Assembly ๊ธฐ์ค€์œผ๋กœ View Type ์ฐพ๊ธฐ
88 var viewType = viewModelType.Assembly.GetType(viewTypeName);
89
90 // ๊ทธ๋ž˜๋„ ๋ชป ์ฐพ์œผ๋ฉด ์ „์ฒด ์–ด์…ˆ๋ธ”๋ฆฌ ์ˆœํšŒ (Fallback)
91 if (viewType == null)
92 {
93 viewType = AppDomain.CurrentDomain.GetAssemblies()
94 .Where(a => !a.IsDynamic)
95 .Select(a => a.GetType(viewTypeName ?? ""))
96 .FirstOrDefault(t => t != null);
97 }
98
99 return viewType != null
100 ? Activator.CreateInstance(viewType)
101 : null;
102 }
103
112 public static void RegisterAll(Assembly assembly)
113 {
114 var viewTypes = assembly.GetTypes()
115 .Where(t => t.IsClass && !t.IsAbstract &&
116 (t.Namespace?.Contains(".Views") == true || t.Namespace?.Contains(".Pages") == true));
117
118 var allTypes = assembly.GetTypes()
119 .Where(t => t.IsClass && !t.IsAbstract);
120
121 foreach (var viewType in viewTypes)
122 {
123 var viewName = viewType.Name;
124 var viewNs = viewType.Namespace ?? "";
125
126 var candidateNames = new[]
127 {
128 viewName + "ViewModel",
129 viewName + ".ViewModel",
130 viewName + "_ViewModel",
131 };
132
133 var candidateNamespaces = new[]
134 {
135 viewNs.Replace(".Views", ".ViewModels"),
136 viewNs.Replace(".Pages", ".ViewModels"),
137 viewNs,
138 };
139
140 foreach (var ns in candidateNamespaces)
141 {
142 foreach (var name in candidateNames)
143 {
144 var fullName = $"{ns}.{name}";
145 var vmType = allTypes.FirstOrDefault(t => t.FullName == fullName);
146
147 if (vmType != null)
148 {
149 ViewModelLocator.Register(viewType, vmType);
150 goto NEXT_VIEW;
151 }
152 }
153 }
154
155 NEXT_VIEW:
156 continue;
157 }
158 }
159 }
160}
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 ๋งคํ•‘์„ ์ž๋™ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค: