ParameterValueResolverFactory.cs 1.95 KB
using System.Collections.Generic;
using System.Linq;
using Rcs.Domain.Entities;
using Rcs.Domain.Enums;
using Rcs.Domain.Models;
using Rcs.Domain.Services;

namespace Rcs.Infrastructure.Services.ParameterResolvers
{
    /// <summary>
    /// 参数值解析器工厂 - 根据来源类型选择对应解析器
    /// @author zzy
    /// </summary>
    public class ParameterValueResolverFactory : IParameterValueResolverFactory
    {
        private readonly Dictionary<ParameterSourceType, IParameterValueResolver> _resolvers;

        /// <summary>
        /// 构造函数 - 通过依赖注入获取所有解析器
        /// </summary>
        public ParameterValueResolverFactory(IEnumerable<IParameterValueResolver> resolvers)
        {
            _resolvers = resolvers.ToDictionary(r => r.SourceType);
        }

        /// <summary>
        /// 解析单个参数值
        /// </summary>
        public object? Resolve(ActionParameterDefinition definition, ParameterContext context)
        {
            if (definition.ParameterSourceType == null)
                return definition.DefaultValue;

            if (_resolvers.TryGetValue(definition.ParameterSourceType.Value, out var resolver))
            {
                return resolver.Resolve(definition, context);
            }

            return definition.DefaultValue;
        }

        /// <summary>
        /// 批量解析动作的所有参数
        /// </summary>
        public List<ResolvedParameter> ResolveAll(
            IEnumerable<ActionParameterDefinition> definitions,
            ParameterContext context)
        {
            return definitions
                .OrderBy(d => d.SortOrder)
                .Select(def => new ResolvedParameter
                {
                    Key = def.ParameterName,
                    Value = Resolve(def, context)?.ToString() ?? string.Empty,
                    ValueType = def.ParameterValueType
                })
                .ToList();
        }
    }
}