Exemple #1
0
        public void BuildUp(object target)
        {
            var objectType          = target.GetType();
            var constructorInstance = new ConstructorInstance(objectType, objectType, ServiceLifetime.Transient);
            var setters             = constructorInstance.FindSetters(ServiceGraph);

            foreach (var setter in setters)
            {
                setter.ApplyQuickBuildProperties(target, this);
            }
        }
Exemple #2
0
        public object QuickBuild(Type objectType)
        {
            assertNotDisposed();

            if (!objectType.IsConcrete())
            {
                throw new InvalidOperationException("Type must be concrete");
            }

            var constructorInstance = new ConstructorInstance(objectType, objectType, ServiceLifetime.Transient);
            var ctor    = constructorInstance.DetermineConstructor(ServiceGraph, out var message);
            var setters = constructorInstance.FindSetters(ServiceGraph);


            if (ctor == null)
            {
                throw new InvalidOperationException(message);
            }

            var dependencies = ctor.GetParameters().Select(x =>
            {
                var instance = ServiceGraph.FindInstance(x);

                if (instance == null)
                {
                    throw new InvalidOperationException($"Cannot QuickBuild type {objectType.GetFullName()} because Lamar cannot determine how to build required dependency {x.ParameterType.FullNameInCode()}");
                }

                try
                {
                    return(instance.QuickResolve(this));
                }
                catch (Exception)
                {
                    // #sadtrombone, do it the heavy way instead
                    return(instance.Resolve(this));
                }
            }).ToArray();

            var service = ctor.Invoke(dependencies);

            foreach (var setter in setters)
            {
                setter.ApplyQuickBuildProperties(service, this);
            }

            return(service);
        }