コード例 #1
0
        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);
            }
        }
コード例 #2
0
        /*
         * 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);
        }
コード例 #3
0
        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);
            }
        }