private object GetInjectionValue(object instance, IInjectionBinding binding, IInjectionInfo injectionInfo) { switch (binding.BindingType) { case InjectionBindingType.InstanceProvider when binding.InjectionMode == InjectionMode.Factory: { var instanceProvider = binding.Value is Type type ? (IInjectionProvider)Activator.CreateInstance(type) : (IInjectionProvider)binding.Value; if (binding.ToConstruct && !CheckIsConstructed(instanceProvider)) { Construct(instanceProvider, true); binding.SetValue(instanceProvider); MarkConstructed(binding.Value); } return(instanceProvider.TakeInstance(instance, injectionInfo.Attribute)); } case InjectionBindingType.Value when binding.InjectionMode == InjectionMode.Singleton: { if (binding.ToConstruct && !CheckIsConstructed(binding.Value)) { Construct(binding.Value, true); MarkConstructed(binding.Value); } return(binding.Value); } case InjectionBindingType.Type when binding.InjectionMode == InjectionMode.Factory: { var value = Activator.CreateInstance((Type)binding.Value); Construct(value, true); return(value); } case InjectionBindingType.Type when binding.InjectionMode == InjectionMode.Singleton: { if (binding.ToConstruct && !CheckIsConstructed(binding.Value)) { var value = Activator.CreateInstance((Type)binding.Value); Construct(value, true); binding.SetValue(value); MarkConstructed(binding.Value); } return(binding.Value); } default: throw new InjectionException(InjectionExceptionType.ValueNotProvided); } }
/* * Instances. */ public object GetInstance(IInjectionBinding binding, object callerInstance, IInjectionInfo injectionInfo) { if (binding == null) { throw new InjectionException(InjectionExceptionType.BindingIsMissing, callerInstance); } IncrementDependencyCounter(binding, callerInstance); var instance = GetInjectionValue(callerInstance, binding, injectionInfo); DecrementDependencyCounter(binding); return(instance); }
private void DestroyInjectedValue(object instance, IInjectionBinding binding, IInjectionInfo injection) { var value = injection.PropertyInfo.GetValue(instance); switch (binding.BindingType) { case InjectionBindingType.InstanceProvider when binding.InjectionMode == InjectionMode.Factory: // Provider constructed (if configured) on the first instance inject. // Provider is destroyed when it's binding is destroyed. ((IInjectionProvider)binding.Value).ReturnInstance(value); return; case InjectionBindingType.Value when binding.InjectionMode == InjectionMode.Singleton: // Value is constructed (if configured) on the first instance inject. // Value is destroyed when it's binding is destroyed. return; case InjectionBindingType.Type when binding.InjectionMode == InjectionMode.Factory: // Factory instance is destroyed when it's un injected. Destroy(value, true); return; case InjectionBindingType.Type when binding.InjectionMode == InjectionMode.Singleton: // Singleton must stay alive even if all dependent parts un injected it. // Singleton will be destroyed when it's binding is destroyed. return; default: throw new InjectionException(InjectionExceptionType.ValueNotDestroyed); } }