Mercurial > pub > ImplabNet
comparison Implab.ServiceHost/Unity/InjectionValueBuilder.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 | 22629bf26121 |
children | 6691aff01de1 |
comparison
equal
deleted
inserted
replaced
276:b4e0f81c7425 | 277:963b17c275be |
---|---|
1 using System; | 1 using System; |
2 using System.Collections.Generic; | |
2 using System.ComponentModel; | 3 using System.ComponentModel; |
4 using System.Linq; | |
3 using System.Xml.Serialization; | 5 using System.Xml.Serialization; |
4 using Unity.Injection; | 6 using Unity.Injection; |
5 | 7 |
6 namespace Implab.ServiceHost.Unity { | 8 namespace Implab.ServiceHost.Unity { |
7 | 9 |
9 | 11 |
10 readonly TypeResolver m_resolver; | 12 readonly TypeResolver m_resolver; |
11 | 13 |
12 public Type DefaultType { get; private set; } | 14 public Type DefaultType { get; private set; } |
13 | 15 |
14 public Type ValueType { get; set; } | 16 public Type ValueType { get; private set; } |
15 | 17 |
16 public object Value { get; set; } | 18 public object Value { get; set; } |
17 | 19 |
18 public InjectionParameterValue Injection { | 20 internal InjectionParameterValue Injection { |
19 get { | 21 get { |
20 if (Value != null) | 22 if (Value != null) |
21 return InjectionParameterValue.ToParameter(Value); | 23 return InjectionParameterValue.ToParameter(Value); |
22 | 24 |
23 return new InjectionParameter(ValueType, null); | 25 return new InjectionParameter(ValueType, null); |
24 } | 26 } |
25 } | 27 } |
26 | 28 |
27 internal InjectionValueBuilder(TypeResolver resolver, Type acceptsType) { | 29 internal InjectionValueBuilder(TypeResolver resolver, Type defaultType) { |
28 m_resolver = resolver; | 30 m_resolver = resolver; |
29 DefaultType = acceptsType; | 31 DefaultType = defaultType; |
30 } | 32 } |
31 | 33 |
32 public Type ResolveType(string typeSpec) { | 34 public Type ResolveInjectedValueType(string typeSpec) { |
33 if (string.IsNullOrEmpty(typeSpec)) { | 35 if (string.IsNullOrEmpty(typeSpec)) { |
34 if (DefaultType == null) | 36 if (DefaultType == null) |
35 throw new Exception("The type must be specified"); | 37 throw new Exception("The type must be specified"); |
36 return DefaultType; | 38 return DefaultType; |
37 } | 39 } |
38 return m_resolver.Resolve(typeSpec); | 40 return m_resolver.Resolve(typeSpec); |
39 } | 41 } |
40 | 42 |
41 public void Visit(ITextValue value) { | 43 public Type ResolveType(string typeSpec) { |
42 ValueType = ResolveType(value.TypeName); | 44 return m_resolver.Resolve(typeSpec); |
43 | |
44 Value = string.IsNullOrEmpty(value.Value) ? | |
45 Safe.CreateDefaultValue(ValueType) : | |
46 TypeDescriptor.GetConverter(ValueType).ConvertFromString(value.Value); | |
47 } | 45 } |
48 | 46 |
49 public void Visit(ISerializedValue value) { | 47 public void SetValue(Type type, object value) { |
50 ValueType = ResolveType(value.TypeName); | 48 ValueType = type; |
51 | 49 Value = value; |
52 var serializer = new XmlSerializer(ValueType); | |
53 | |
54 using (var reader = value.GetReader()) | |
55 Value = new InjectionParameter(ValueType, serializer.Deserialize(reader)); | |
56 } | 50 } |
57 | 51 |
58 public void Visit(IDependencyReference value) { | 52 public void SetValue<T>(T value) { |
59 ValueType = ResolveType(value.TypeName); | 53 SetValue(typeof(T), value); |
60 Value = new ResolvedParameter(ValueType, value.DependencyName); | |
61 } | 54 } |
62 | 55 |
56 public void SetDependencyReference(Type type, string name, bool optional) { | |
57 ValueType = type; | |
58 Value = optional ? (object)new OptionalParameter(type, name) : new ResolvedParameter(type, name); | |
59 } | |
60 | |
61 internal void Visit(ArrayParameterElement arrayParameter) { | |
62 Type itemsType = null; | |
63 var arrayType = string.IsNullOrEmpty(arrayParameter.TypeName) ? null : ResolveType(arrayParameter.TypeName); | |
64 | |
65 if (!string.IsNullOrEmpty(arrayParameter.ItemsType)) { | |
66 itemsType = ResolveType(arrayParameter.ItemsType); | |
67 if (arrayType == null) | |
68 arrayType = itemsType.MakeArrayType(); | |
69 } else { | |
70 itemsType = arrayType?.GetInterface(typeof(IEnumerable<>).FullName)?.GetGenericArguments()[0]; | |
71 } | |
72 | |
73 if (itemsType == null) | |
74 throw new Exception("Failed to determine array elements type"); | |
75 | |
76 InjectionParameterValue[] injections = (arrayParameter.Items ?? new InjectionParameterElement[0]) | |
77 .Select(x => { | |
78 var builder = new InjectionValueBuilder(m_resolver, itemsType); | |
79 x.Visit(builder); | |
80 return builder.Injection; | |
81 }) | |
82 .ToArray(); | |
83 | |
84 var array = itemsType.IsGenericParameter ? (object)new GenericResolvedArrayParameter(itemsType.Name, injections) : new ResolvedArrayParameter(itemsType, injections); | |
85 ValueType = arrayType; | |
86 Value = array; | |
87 } | |
63 } | 88 } |
64 } | 89 } |