ContainerBuilder.cs
110 lines
| 3.5 KiB
| text/x-csharp
|
CSharpLexer
cin
|
r274 | using System; | |
cin
|
r278 | using System.Reflection; | |
using Unity; | |||
cin
|
r274 | ||
namespace Implab.ServiceHost.Unity { | |||
public class ContainerBuilder { | |||
readonly TypeResolver m_resolver; | |||
cin
|
r279 | readonly IUnityContainer m_container; | |
cin
|
r274 | ||
readonly ContainerConfigurationSchema m_schema; | |||
cin
|
r279 | public IUnityContainer Container { | |
cin
|
r274 | get { | |
return m_container; | |||
} | |||
} | |||
public ContainerBuilder() : this(null, null) { | |||
} | |||
cin
|
r279 | public ContainerBuilder(IUnityContainer container, ContainerConfigurationSchema schema) { | |
cin
|
r274 | m_container = container ?? new UnityContainer(); | |
m_resolver = new TypeResolver(); | |||
m_schema = schema ?? ContainerConfigurationSchema.Default; | |||
} | |||
public Type ResolveType(string typeReference) { | |||
cin
|
r279 | return string.IsNullOrEmpty(typeReference) ? null : m_resolver.Resolve(typeReference, true); | |
cin
|
r274 | } | |
cin
|
r278 | public void Visit(ITypeRegistration registration) { | |
Safe.ArgumentNotNull(registration, nameof(registration)); | |||
var registrationType = registration.GetRegistrationType(this); | |||
var implementationType = registration.GetImplementationType(this) ?? registrationType; | |||
if (registrationType == null) | |||
throw new Exception($"A type must be specified for the registration {registration.Name}"); | |||
var builder = new TypeRegistrationBuilder( | |||
m_resolver, | |||
registrationType, | |||
implementationType | |||
); | |||
builder.Lifetime = registration.GetLifetime(this); | |||
if (registration.MemberInjections != null) { | |||
foreach(var member in registration.MemberInjections) | |||
member.Visit(builder); | |||
} | |||
m_container.RegisterType( | |||
builder.RegistrationType, | |||
builder.ImplementationType, | |||
registration.Name, | |||
builder.Lifetime, | |||
builder.Injections | |||
); | |||
cin
|
r274 | } | |
cin
|
r278 | public void Visit(IInstanceRegistration registration) { | |
Safe.ArgumentNotNull(registration, nameof(registration)); | |||
var registrationType = registration.GetRegistrationType(this); | |||
var builder = new InstanceRegistrationBuilder ( | |||
m_resolver, | |||
registrationType | |||
); | |||
builder.Lifetime = registration.GetLifetime(this); | |||
if (registration.MemberInjections != null) { | |||
foreach(var member in registration.MemberInjections) | |||
member.Visit(builder.ValueBuilder); | |||
} | |||
if (builder.RegistrationType == null && builder.ValueBuilder.ValueType == null) | |||
throw new Exception($"A type must be specified for the registration {registration.Name}"); | |||
m_container.RegisterInstance( | |||
builder.RegistrationType ?? builder.ValueBuilder.ValueType, | |||
registration.Name, | |||
cin
|
r279 | builder.ValueBuilder.Value, | |
cin
|
r278 | builder.Lifetime | |
); | |||
cin
|
r274 | } | |
cin
|
r278 | public void AddNamespace(string ns) { | |
m_resolver.AddNamespace(ns); | |||
} | |||
public void AddAssembly(string assembly) { | |||
cin
|
r274 | } | |
public void Include(string file) { | |||
var includeContext = new ContainerBuilder(m_container, m_schema); | |||
includeContext.LoadConfig(file); | |||
} | |||
public void LoadConfig(string file) { | |||
var config = m_schema.LoadFile(file); | |||
cin
|
r277 | config.Visit(this); | |
cin
|
r274 | } | |
cin
|
r278 | ||
cin
|
r274 | } | |
} |