private object InjectConstructor(ConstructorInfo method, DataRequest request) { var parameters = new List <object>(); foreach (var parameterInfo in method.GetParameters()) { object parameterValue = null; if (_configuration.CircularReferenceHandling == CircularReferenceHandlingAlgorithm.AutoWire) { var currentRequest = request; var requestTypeInfo = parameterInfo.ParameterType.GetTypeInfo(); while (currentRequest != null) { if (requestTypeInfo.IsAssignableFrom(currentRequest.RequestedType.GetTypeInfo())) { parameterValue = currentRequest.Instance; break; } currentRequest = currentRequest.ParentRequest; } } var foundValue = false; var newRequest = CreateDataRequestForParameter(parameterInfo, request); if (parameterValue == null) { foundValue = _constraintHelper.GetUnTypedValue(out parameterValue, parameterInfo.ParameterType, request.Constraints, null, parameterInfo.Name); if (parameterValue != null) { newRequest.Fixture.Behavior.Apply(newRequest, parameterValue); } } if (!foundValue) { parameterValue = parameterValue ?? newRequest.Fixture.Generate(newRequest); if (parameterValue == null) { throw new Exception("Could not create Type " + parameterInfo.ParameterType.FullName); } } parameters.Add(parameterValue); } return(method.Invoke(parameters.ToArray())); }
public virtual void Populate(object instance, DataRequest request, ComplexModel model) { if (instance == null) { return; } if (_configuration.PopulateProperties) { foreach (var propertyInfo in _propertySelector.SelectProperties(instance, request, model)) { object propertyValue = null; if (_configuration.CircularReferenceHandling == CircularReferenceHandlingAlgorithm.AutoWire) { var currentRequest = request; var requestTypeInfo = propertyInfo.PropertyType.GetTypeInfo(); while (currentRequest != null) { if (requestTypeInfo.IsAssignableFrom(currentRequest.RequestedType.GetTypeInfo())) { propertyValue = currentRequest.Instance; break; } currentRequest = currentRequest.ParentRequest; } } var newRequest = CreateDataRequestForProperty(propertyInfo, request); var foundProperty = false; if (propertyValue == null) { foundProperty = _helper.GetUnTypedValue(out propertyValue, propertyInfo.PropertyType, request.Constraints, null, propertyInfo.Name); if (propertyValue != null) { propertyValue = newRequest.Fixture.Behavior.Apply(newRequest, propertyValue); } } if (!foundProperty && propertyValue == null) { if (!model.GetPropertyValue(newRequest, propertyInfo, out propertyValue)) { if (model.SkipProperty(newRequest, propertyInfo)) { continue; } propertyValue = newRequest.Fixture.Generate(newRequest); } else { propertyValue = newRequest.Fixture.Behavior.Apply(newRequest, propertyValue); } } if (!foundProperty && propertyValue == null) { throw new Exception("Could not create type " + propertyInfo.PropertyType.FullName); } _setter.SetProperty(propertyInfo, instance, propertyValue); } } if (_configuration.PopulateFields) { foreach (var fieldInfo in _fieldSelector.SelectFields(instance, request, model)) { object propertyValue; var foundValue = _helper.GetUnTypedValue(out propertyValue, fieldInfo.FieldType, request.Constraints, null, fieldInfo.Name); var newRequest = CreateDataRequestForField(fieldInfo, request); if (propertyValue != null) { propertyValue = newRequest.Fixture.Behavior.Apply(newRequest, propertyValue); } else if (!foundValue) { propertyValue = newRequest.Fixture.Generate(newRequest); } if (!foundValue && propertyValue == null) { throw new Exception("Could not create type " + fieldInfo.FieldType.FullName); } _fieldSetter.SetField(fieldInfo, instance, propertyValue); } } }