public TypedActivityTypeDescriber(IActivityPropertyOptionsResolver optionsResolver, IActivityPropertyUIHintResolver uiHintResolver, IActivityPropertyDefaultValueResolver defaultValueResolver, IServiceScopeFactory serviceScopeFactory)
 {
     _optionsResolver      = optionsResolver;
     _uiHintResolver       = uiHintResolver;
     _defaultValueResolver = defaultValueResolver;
     _serviceScopeFactory  = serviceScopeFactory;
 }
 public TypedActivityTypeDescriber(IActivityPropertyOptionsResolver optionsResolver, IActivityPropertyUIHintResolver uiHintResolver, IActivityPropertyDefaultValueResolver defaultValueResolver)
 {
     _optionsResolver      = optionsResolver;
     _uiHintResolver       = uiHintResolver;
     _defaultValueResolver = defaultValueResolver;
 }
        private async ValueTask SetNestedActivityPropertiesAsync(object nestedInstance, ActivityExecutionContext activityExecutionContext, IDictionary <string, IActivityPropertyValueProvider> providers, IActivityPropertyDefaultValueResolver defaultValueResolver, string nestedInstanceName = null, CancellationToken cancellationToken = default)
        {
            var properties       = nestedInstance.GetType().GetProperties().Where(IsActivityInputProperty).ToList();
            var nestedProperties = nestedInstance.GetType().GetProperties().Where(IsActivityObjectInputProperty).ToList();

            foreach (var property in properties)
            {
                var propertyName = nestedInstanceName == null ? property.Name : $"{nestedInstanceName}_{property.Name}";
                if (!providers.TryGetValue(propertyName, out var provider))
                {
                    continue;
                }

                try
                {
                    var value = await provider.GetValueAsync(activityExecutionContext, cancellationToken);

                    if (value == null)
                    {
                        value = defaultValueResolver.GetDefaultValue(property);
                    }

                    if (value != null)
                    {
                        property.SetValue(nestedInstance, value);
                    }
                }
                catch (Exception e)
                {
                    throw new CannotSetActivityPropertyValueException($@"An exception was thrown whilst setting '{nestedInstance.GetType().Name}.{property.Name}'. See the inner exception for further details.", e);
                }
            }

            foreach (var nestedProperty in nestedProperties)
            {
                var instance = Activator.CreateInstance(nestedProperty.PropertyType);

                var nextInstanceName = nestedInstanceName == null ? nestedProperty.Name : $"{nestedInstanceName}_{nestedProperty.Name}";

                await SetNestedActivityPropertiesAsync(instance, activityExecutionContext, providers, defaultValueResolver, nextInstanceName, cancellationToken);

                nestedProperty.SetValue(nestedInstance, instance);
            }
        }