Mercurial > pub > ImplabNet
diff Implab.ServiceHost/Unity/TypeResolver.cs @ 277:963b17c275be v3
Refactoring
Added <array> element to injection parameters
Working on registrations of factories
author | cin |
---|---|
date | Sat, 28 Apr 2018 18:48:09 +0300 |
parents | 9d1cca834b05 |
children | 6691aff01de1 |
line wrap: on
line diff
--- a/Implab.ServiceHost/Unity/TypeResolver.cs Sat Apr 28 00:11:38 2018 +0300 +++ b/Implab.ServiceHost/Unity/TypeResolver.cs Sat Apr 28 18:48:09 2018 +0300 @@ -5,11 +5,9 @@ using System.Text.RegularExpressions; using Implab.Diagnostics; -namespace Implab.ServiceHost.Unity -{ +namespace Implab.ServiceHost.Unity { using static Trace<TypeResolver>; - public class TypeResolver - { + public class TypeResolver { readonly Dictionary<string, Type> m_cache = new Dictionary<string, Type>(); Regex _nsRx = new Regex(@"^\w+(\.\w+)*$", RegexOptions.Compiled); @@ -49,7 +47,7 @@ var argc = reference.IsGeneric ? reference.GenericParameters.Length : 0; Type resolved; - if(!m_cache.TryGetValue(reference.ToString(), out resolved)) { + if (!m_cache.TryGetValue(reference.ToString(), out resolved)) { resolved = ResolveInternal(reference, args, argc); if (resolved == null) throw new Exception($"Failed to resolve {reference}"); @@ -65,7 +63,7 @@ Type ResolveInternal(TypeReference reference, Type[] args, int argc) { var resolved = ProbeInNamespaces( - String.Join(".", new [] { reference.Namespace, reference.TypeName }.Where(x => !string.IsNullOrEmpty(x)) ), + String.Join(".", new[] { reference.Namespace, reference.TypeName }.Where(x => !string.IsNullOrEmpty(x))), args, argc, reference.IsArray, @@ -73,17 +71,24 @@ ); if (resolved == null && m_parent != null) - resolved = m_parent.Resolve(reference); - + resolved = m_parent.ResolveInternal(reference, args, argc); + return resolved; } public Type ProbeInNamespaces(string localName, Type[] args, int argc, bool isArray, string referenceName) { foreach (var ns in m_namespases) { - var typeName = FormatName(new [] { ns, localName}, argc, args, isArray); + var typeName = FormatName(new[] { ns, localName }, argc); var resolved = Probe(typeName); if (resolved != null) { + if (args != null && args.Length > 0) { + resolved = resolved.MakeGenericType(args); + } + + if (isArray) + resolved = resolved.MakeArrayType(); + Log("Probe succeed {0} in '{1}': {2} -> {3}", referenceName, ns, typeName, resolved.AssemblyQualifiedName); return resolved; } else { @@ -97,7 +102,7 @@ Type Probe(string typeName) { var assemblies = AppDomain.CurrentDomain.GetAssemblies(); - foreach(var assembly in assemblies) { + foreach (var assembly in assemblies) { var type = assembly.GetType(typeName); if (type != null) return type; @@ -105,25 +110,16 @@ return null; } - string FormatName(string[] parts, int argc, Type[] args, bool isArray) { + string FormatName(string[] parts, int argc) { var builder = new StringBuilder(); - + builder.Append(String.Join(".", parts.Where(x => !string.IsNullOrEmpty(x)))); if (argc > 0) { builder.Append('`'); builder.Append(argc); } - if (args!= null && args.Length > 0) { - builder.Append('['); - builder.Append(string.Join(",", args.Select(x => $"[{x.AssemblyQualifiedName}]"))); - builder.Append(']'); - } - - if(isArray) - builder.Append("[]"); - - return builder.ToString(); + return builder.ToString(); } } } \ No newline at end of file