public bool CouldBuild(Type concreteType) { var constructorInstance = new ConstructorInstance(concreteType, concreteType, ServiceLifetime.Transient); foreach (var policy in InstancePolicies) { policy.Apply(constructorInstance); } var ctor = constructorInstance.DetermineConstructor(this, out string message); return(ctor != null && message.IsEmpty()); }
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); }