object instantiateByReflectionConstructor(ILifetimeScope lifetimeScope, Type t)
        {
            var constructors = t.GetConstructors();

            if (constructors.Length == 0)
            {
                throw new ResolveException("failed to instantiate type {0}: no public constructor", t);
            }

            var constructor = selectPreferredConstructor(constructors);
            var parameters  = constructor.GetParameters();

            var resolvedObjects = new object[parameters.Length];

            foreach (var p in parameters.indices())
            {
                var obj = lifetimeScope.resolve(parameters[p].ParameterType);
                resolvedObjects[p] = obj;
            }

            var instance = constructor.Invoke(resolvedObjects);

            lifetimeScope.Debug("inst {2,8:X}: {0} => {1}".fmt(t.Name, instance, (uint)instance.GetHashCode()));

            return(instance);
        }
예제 #2
0
        static object callStaticMethod(ILifetimeScope lifetimeScope, MethodInfo concreteMethod)
        {
            Debug.Assert(!concreteMethod.IsGenericMethodDefinition);
            Debug.Assert(concreteMethod.IsStatic);

            var parameters = concreteMethod.GetParameters();
            var arguments = new object[parameters.Length];
            foreach (var p in parameters.indices())
                arguments[p] = lifetimeScope.resolve(parameters[p].ParameterType);

            return concreteMethod.Invoke(null, arguments);
        }
예제 #3
0
        static object callStaticMethod(ILifetimeScope lifetimeScope, MethodInfo concreteMethod)
        {
            Debug.Assert(!concreteMethod.IsGenericMethodDefinition);
            Debug.Assert(concreteMethod.IsStatic);

            var parameters = concreteMethod.GetParameters();
            var arguments  = new object[parameters.Length];

            foreach (var p in parameters.indices())
            {
                arguments[p] = lifetimeScope.resolve(parameters[p].ParameterType);
            }

            return(concreteMethod.Invoke(null, arguments));
        }
예제 #4
0
        object buildFromGenericInterface(ILifetimeScope lifetimeScope, Type genericInterface)
        {
            Debug.Assert(genericInterface.IsInterface && genericInterface.IsGenericType && !genericInterface.IsGenericTypeDefinition);
            var def            = genericInterface.GetGenericTypeDefinition();
            var implementation = tryGetImplementationForInterface(def);

            if (implementation == null)
            {
                return(buildFromGenericByUsingAGenerator(lifetimeScope, genericInterface));
            }

            Debug.Assert(implementation.GetGenericArguments().Length == genericInterface.GetGenericArguments().Length);

            var implementationType = implementation.MakeGenericType(genericInterface.GetGenericArguments());

            return(lifetimeScope.resolve(implementationType));
        }
예제 #5
0
        object buildFromInterface(ILifetimeScope lifetimeScope, Type t)
        {
            Debug.Assert(t.IsInterface);
            var implementation = tryGetImplementationForInterface(t);

            if (implementation != null)
            {
                return(lifetimeScope.resolve(implementation));
            }

            if (t.IsGenericType)
            {
                return(buildFromGenericInterface(lifetimeScope, t));
            }

            throw new ResolveException("failed to resolve type {0}: failed to resolve interface", t);
        }
        object instantiateByReflectionConstructor(ILifetimeScope lifetimeScope, Type t)
        {
            var constructors = t.GetConstructors();
            if (constructors.Length == 0)
                throw new ResolveException("failed to instantiate type {0}: no public constructor", t);

            var constructor = selectPreferredConstructor(constructors);
            var parameters = constructor.GetParameters();

            var resolvedObjects = new object[parameters.Length];

            foreach (var p in parameters.indices())
            {
                var obj = lifetimeScope.resolve(parameters[p].ParameterType);
                resolvedObjects[p] = obj;
            }

            var instance = constructor.Invoke(resolvedObjects);

            lifetimeScope.Debug("inst {2,8:X}: {0} => {1}".fmt(t.Name, instance, (uint)instance.GetHashCode()));

            return instance;
        }
예제 #7
0
 public static T resolve <T>(this ILifetimeScope lifetimeScope)
 {
     return((T)lifetimeScope.resolve(typeof(T)));
 }
예제 #8
0
        object buildFromInterface(ILifetimeScope lifetimeScope, Type t)
        {
            Debug.Assert(t.IsInterface);
            var implementation = tryGetImplementationForInterface(t);
            if (implementation != null)
                return lifetimeScope.resolve(implementation);

            if (t.IsGenericType)
                return buildFromGenericInterface(lifetimeScope, t);

            throw new ResolveException("failed to resolve type {0}: failed to resolve interface", t);
        }
예제 #9
0
        object buildFromGenericInterface(ILifetimeScope lifetimeScope, Type genericInterface)
        {
            Debug.Assert(genericInterface.IsInterface && genericInterface.IsGenericType && !genericInterface.IsGenericTypeDefinition);
            var def = genericInterface.GetGenericTypeDefinition();
            var implementation = tryGetImplementationForInterface(def);
            if (implementation == null)
                return buildFromGenericByUsingAGenerator(lifetimeScope, genericInterface);

            Debug.Assert(implementation.GetGenericArguments().Length == genericInterface.GetGenericArguments().Length);

            var implementationType = implementation.MakeGenericType(genericInterface.GetGenericArguments());

            return lifetimeScope.resolve(implementationType);
        }