コード例 #1
0
        private object ResolveInternal(TypeRegistration registration, ParametersOverloads parameters, IoCOptions options)
        {
            if (options == null)
            {
                options = Options;
            }

            object resolved;

            // Attempt container resolution
            if (TryResolve(out resolved, registration, parameters, options))
            {
                return(resolved);
            }

            // Attempt container resolution
            if (!string.IsNullOrEmpty(registration.Name))
            {
                // Fail if requesting named resolution and settings set to fail if unresolved
                if (options.NamedResolutionFailureAction == NamedResolutionFailureAction.Fail)
                {
                    IoCResolutionException.Raise(registration.Type);
                }

                // Attemped unnamed fallback container resolution if relevant and requested
                if (options.NamedResolutionFailureAction == NamedResolutionFailureAction.AttemptUnnamedResolution)
                {
                    if (TryResolve(out resolved, new TypeRegistration(registration.Type), parameters, options))
                    {
                        return(resolved);
                    }
                }
            }

#if EXPRESSIONS
            // Attempt to construct an automatic lazy factory if possible
            if (IsAutomaticLazyFactoryRequest(registration.Type))
            {
                return(GetLazyAutomaticFactoryRequest(registration.Type));
            }
#endif
#if ENUMERABLE_REQUESTS
            if (IsIEnumerableRequest(registration.Type))
            {
                return(GetIEnumerableRequest(registration.Type));
            }
#endif
            // Attempt unregistered construction if possible and requested
            if ((options.UnregisteredResolutionAction == UnregisteredResolutionAction.AttemptResolve)
                /*|| (registration.Type.IsGenericType() && options.UnregisteredResolutionAction == UnregisteredResolutionAction.GenericsOnly*/)
            {
                if (!registration.Type.IsAbstract() && !registration.Type.IsInterface())
                {
                    return(ConstructType(registration.Type, registration.Type, null, parameters));
                }
            }

            // Unable to resolve - throw
            return(IoCResolutionException.Raise(registration.Type));
        }
コード例 #2
0
 public override object GetObject(Type requestedType, IoCContainer container, ParametersOverloads parameters = null)
 {
     if (instance == null)
     {
         instance = base.GetObject(requestedType, container, parameters);
     }
     return(instance);
 }
コード例 #3
0
        private bool TryResolve(out object resolved, TypeRegistration registration, ParametersOverloads parameters, IoCOptions options)
        {
            for (var container = this; container != null; container = container.Parent)
            {
                IoCFactory factory;
                if (registry.TryGetValue(registration, out factory))
                {
                    try {
                        resolved = factory.GetObject(registration.Type, this, parameters);
                        return(true);
                    }
                    catch (IoCResolutionException) {
                        throw;
                    }
                    catch (Exception ex) {
                        IoCResolutionException.Raise(registration.Type, ex);
                    }
                }

#if RESOLVE_OPEN_GENERICS
                // Attempt container resolution of open generic
                if (registration.Type.IsGenericType())
                {
                    var openTypeRegistration = new TypeRegistration(registration.Type.GetGenericTypeDefinition(),
                                                                    registration.Name);

                    if (_RegisteredTypes.TryGetValue(openTypeRegistration, out factory))
                    {
                        try {
                            return(factory.GetObject(registration.Type, this, parameters, options));
                        }
                        catch (TinyIoCResolutionException) {
                            throw;
                        }
                        catch (Exception ex) {
                            IoCResolutionException.Raise(registration.Type, ex);
                        }
                    }
                }
#endif
            }

            resolved = null;
            return(false);
        }
コード例 #4
0
 public override object GetObject(Type requestedType, IoCContainer container, ParametersOverloads parameters = null)
 {
     return(container.ConstructType(requestedType, implementationType, constructor, parameters));
 }
コード例 #5
0
 public abstract object GetObject(Type requestedType, IoCContainer container, ParametersOverloads parameters = null);
コード例 #6
0
        protected IoCDependency(IoCDependencyInit initMode, bool required, IoCContainer container, ParametersOverloads parameters)
        {
            this.container = container;
            InitMode       = initMode;
            Required       = required;

            if (initMode == IoCDependencyInit.Immediate)
            {
                value = Resolve(parameters);
            }
        }
コード例 #7
0
 public IoCDependency(ParametersOverloads parameters, bool required = true, IoCContainer container = null) :
     this(IoCDependencyInit.Immediate, required, container, parameters)
 {
 }
コード例 #8
0
        public object ConstructType(Type requestedType, Type implementationType, ConstructorInfo constructor, ParametersOverloads parameters)
        {
            var typeToConstruct = implementationType;

#if RESOLVE_OPEN_GENERICS
            if (implementationType.IsGenericTypeDefinition())
            {
                if (requestedType == null || !requestedType.IsGenericType() || !requestedType.GetGenericArguments().Any())
                {
                    throw new TinyIoCResolutionException(typeToConstruct);
                }

                typeToConstruct = typeToConstruct.MakeGenericType(requestedType.GetGenericArguments());
            }
#endif
            return(Constructor.New(typeToConstruct, constructor, parameters));
        }
コード例 #9
0
 public object Resolve(Type resolveType, ParametersOverloads parameters, IoCOptions options = null)
 {
     return(ResolveInternal(new TypeRegistration(resolveType), parameters, options));
 }