コード例 #1
0
        public object CreateInstance(IObjectResolver resolver, IReadOnlyList <IInjectParameter> parameters)
        {
            var parameterInfos  = injectTypeInfo.InjectConstructor.ParameterInfos;
            var parameterValues = CappedArrayPool <object> .Shared8Limit.Rent(parameterInfos.Length);

            try
            {
                for (var i = 0; i < parameterInfos.Length; i++)
                {
                    var parameterInfo = parameterInfos[i];
                    try
                    {
                        parameterValues[i] = resolver.ResolveOrParameter(
                            parameterInfo.ParameterType,
                            parameterInfo.Name,
                            parameters);
                    }
                    catch (VContainerException ex)
                    {
                        throw new VContainerException(parameterInfo.ParameterType, $"Failed to resolve {injectTypeInfo.Type} : {ex.Message}");
                    }
                }
                var instance = injectTypeInfo.InjectConstructor.ConstructorInfo.Invoke(parameterValues);
                Inject(instance, resolver, parameters);
                return(instance);
            }
            finally
            {
                CappedArrayPool <object> .Shared8Limit.Return(parameterValues);
            }
        }
コード例 #2
0
        void InjectMethods(object obj, IObjectResolver resolver, IReadOnlyList <IInjectParameter> parameters)
        {
            if (injectTypeInfo.InjectMethods == null)
            {
                return;
            }

            foreach (var method in injectTypeInfo.InjectMethods)
            {
                var parameterInfos  = method.ParameterInfos;
                var parameterValues = CappedArrayPool <object> .Shared8Limit.Rent(parameterInfos.Length);

                try
                {
                    for (var i = 0; i < parameterInfos.Length; i++)
                    {
                        var parameterInfo = parameterInfos[i];
                        try
                        {
                            parameterValues[i] = resolver.ResolveOrParameter(
                                parameterInfo.ParameterType,
                                parameterInfo.Name,
                                parameters);
                        }
                        catch (VContainerException ex)
                        {
                            throw new VContainerException(parameterInfo.ParameterType, $"Failed to resolve {injectTypeInfo.Type} : {ex.Message}");
                        }
                    }
                    method.MethodInfo.Invoke(obj, parameterValues);
                }
                finally
                {
                    CappedArrayPool <object> .Shared8Limit.Return(parameterValues);
                }
            }
        }