private void InitializeAfterConstruction(object obj)
{
if (obj == null)
{
return;
}
string objectType = ObjectToStringHelper.ToTypeString(obj);
Log.Debug("Initializing type '{0}' after construction", objectType);
// TODO: Consider to cache for performance
var dependencyResolverManager = DependencyResolverManager.Default;
var dependencyResolver = _serviceLocator.ResolveType<IDependencyResolver>();
dependencyResolverManager.RegisterDependencyResolverForInstance(obj, dependencyResolver);
Log.Debug("Injecting properties into type '{0}' after construction", objectType);
var type = obj.GetType();
var typeMetaData = GetTypeMetaData(type);
foreach (var injectedProperty in typeMetaData.GetInjectedProperties())
{
var propertyInfo = injectedProperty.Key;
var injectAttribute = injectedProperty.Value;
try
{
var dependency = _serviceLocator.ResolveType(injectAttribute.Type, injectAttribute.Tag);
propertyInfo.SetValue(obj, dependency, null);
}
catch (Exception ex)
{
throw Log.ErrorAndCreateException<InvalidOperationException>(ex, "Failed to set property '{0}.{1}' during property dependency injection", type.Name, propertyInfo.Name);
}
}
var objAsINeedCustomInitialization = obj as INeedCustomInitialization;
if (objAsINeedCustomInitialization != null)
{
objAsINeedCustomInitialization.Initialize();
}
}