Dreamine.MVVM.Core 1.0.13
중요: 자동 등록된 타입은 기본적으로 Singleton으로 등록됩니다. 따라서 자동 발견된 ViewModel, Model, Event, Manager는 애플리케이션이 별도 수명으로 명시 등록하지 않는 한 반복 해석 시 동일 인스턴스를 유지합니다.
로딩중...
검색중...
일치하는것 없음
AutoRegistrationService.cs
이 파일의 문서화 페이지로 가기
1using System;
2using System.Linq;
3using System.Reflection;
4using Dreamine.MVVM.Interfaces.DependencyInjection;
5
7{
16 public sealed class AutoRegistrationService : IAutoRegistrationService
17 {
26 private readonly IAssemblyTypeScanner _typeScanner;
35 private readonly IAutoRegistrationFilter _filter;
36
70 IAssemblyTypeScanner typeScanner,
71 IAutoRegistrationFilter filter)
72 {
73 _typeScanner = typeScanner ?? throw new ArgumentNullException(nameof(typeScanner));
74 _filter = filter ?? throw new ArgumentNullException(nameof(filter));
75 }
76
109 public void RegisterAll(Assembly rootAssembly, IServiceRegistry registry)
110 {
111 if (rootAssembly is null)
112 {
113 throw new ArgumentNullException(nameof(rootAssembly));
114 }
115
116 if (registry is null)
117 {
118 throw new ArgumentNullException(nameof(registry));
119 }
120
121 foreach (Assembly assembly in _typeScanner.GetCandidateAssemblies(rootAssembly))
122 {
123 RegisterAssemblyTypes(assembly, registry);
124 }
125 }
126
151 private void RegisterAssemblyTypes(Assembly assembly, IServiceRegistry registry)
152 {
153 foreach (Type type in _typeScanner.GetLoadableTypes(assembly))
154 {
155 RegisterType(type, registry);
156 }
157 }
158
183 private void RegisterType(Type type, IServiceRegistry registry)
184 {
185 if (!_filter.IsTarget(type))
186 {
187 return;
188 }
189
190 if (registry.IsRegistered(type))
191 {
192 return;
193 }
194
195 RegisterSingletonByReflection(type, registry);
196 }
197
222 private static void RegisterSingletonByReflection(Type implementationType, IServiceRegistry registry)
223 {
224 MethodInfo registerMethod = typeof(IServiceRegistry)
225 .GetMethods()
226 .Single(method =>
227 method.Name == nameof(IServiceRegistry.RegisterSingleton) &&
228 method.IsGenericMethodDefinition &&
229 method.GetGenericArguments().Length == 1 &&
230 method.GetParameters().Length == 0);
231
232 MethodInfo closedMethod = registerMethod.MakeGenericMethod(implementationType);
233
234 closedMethod.Invoke(registry, null);
235 }
236 }
237}
AutoRegistrationService(IAssemblyTypeScanner typeScanner, IAutoRegistrationFilter filter)
void RegisterAssemblyTypes(Assembly assembly, IServiceRegistry registry)
void RegisterAll(Assembly rootAssembly, IServiceRegistry registry)
static void RegisterSingletonByReflection(Type implementationType, IServiceRegistry registry)