InjectionValueBuilder.cs
88 lines
| 3.0 KiB
| text/x-csharp
|
CSharpLexer
cin
|
r274 | using System; | |
cin
|
r277 | using System.Collections.Generic; | |
cin
|
r274 | using System.ComponentModel; | |
cin
|
r277 | using System.Linq; | |
cin
|
r274 | using System.Xml.Serialization; | |
using Unity.Injection; | |||
namespace Implab.ServiceHost.Unity { | |||
public class InjectionValueBuilder { | |||
readonly TypeResolver m_resolver; | |||
public Type DefaultType { get; private set; } | |||
cin
|
r277 | public Type ValueType { get; private set; } | |
cin
|
r274 | ||
public object Value { get; set; } | |||
cin
|
r277 | internal InjectionParameterValue Injection { | |
cin
|
r274 | get { | |
if (Value != null) | |||
return InjectionParameterValue.ToParameter(Value); | |||
return new InjectionParameter(ValueType, null); | |||
} | |||
} | |||
cin
|
r277 | internal InjectionValueBuilder(TypeResolver resolver, Type defaultType) { | |
cin
|
r274 | m_resolver = resolver; | |
cin
|
r277 | DefaultType = defaultType; | |
cin
|
r274 | } | |
cin
|
r277 | public Type ResolveInjectedValueType(string typeSpec) { | |
cin
|
r274 | if (string.IsNullOrEmpty(typeSpec)) { | |
if (DefaultType == null) | |||
throw new Exception("The type must be specified"); | |||
return DefaultType; | |||
} | |||
return m_resolver.Resolve(typeSpec); | |||
} | |||
cin
|
r277 | public Type ResolveType(string typeSpec) { | |
return m_resolver.Resolve(typeSpec); | |||
} | |||
cin
|
r274 | ||
cin
|
r277 | public void SetValue(Type type, object value) { | |
ValueType = type; | |||
Value = value; | |||
} | |||
public void SetValue<T>(T value) { | |||
SetValue(typeof(T), value); | |||
} | |||
public void SetDependencyReference(Type type, string name, bool optional) { | |||
ValueType = type; | |||
Value = optional ? (object)new OptionalParameter(type, name) : new ResolvedParameter(type, name); | |||
cin
|
r274 | } | |
cin
|
r277 | internal void Visit(ArrayParameterElement arrayParameter) { | |
Type itemsType = null; | |||
var arrayType = string.IsNullOrEmpty(arrayParameter.TypeName) ? null : ResolveType(arrayParameter.TypeName); | |||
cin
|
r274 | ||
cin
|
r277 | if (!string.IsNullOrEmpty(arrayParameter.ItemsType)) { | |
itemsType = ResolveType(arrayParameter.ItemsType); | |||
if (arrayType == null) | |||
arrayType = itemsType.MakeArrayType(); | |||
} else { | |||
itemsType = arrayType?.GetInterface(typeof(IEnumerable<>).FullName)?.GetGenericArguments()[0]; | |||
} | |||
cin
|
r274 | ||
cin
|
r277 | if (itemsType == null) | |
throw new Exception("Failed to determine array elements type"); | |||
cin
|
r274 | ||
cin
|
r277 | InjectionParameterValue[] injections = (arrayParameter.Items ?? new InjectionParameterElement[0]) | |
.Select(x => { | |||
var builder = new InjectionValueBuilder(m_resolver, itemsType); | |||
x.Visit(builder); | |||
return builder.Injection; | |||
}) | |||
.ToArray(); | |||
var array = itemsType.IsGenericParameter ? (object)new GenericResolvedArrayParameter(itemsType.Name, injections) : new ResolvedArrayParameter(itemsType, injections); | |||
ValueType = arrayType; | |||
Value = array; | |||
cin
|
r274 | } | |
} | |||
} |