/// <summary> /// 解析内容映射器。 /// </summary> /// <param name="baseMapper">给定的基础 <see cref="AccessorTypeParameterMapper"/>。</param> /// <returns>返回 <see cref="ContentAccessorTypeParameterMapper"/>。</returns> public static ContentAccessorTypeParameterMapper ParseMapper(AccessorTypeParameterMapper baseMapper) { var mappings = ParseCollection(baseMapper?.Accessor.ArgumentType); return(new ContentAccessorTypeParameterMapper(baseMapper, mappings)); }
public virtual IDataBuilder AddGenericServiceByPopulateAccessorTypeParameters(Type serviceType, Type implementationTypeDefinition, Func <Type, AccessorTypeParameterMapper, Type> populateServiceFactory = null, Func <Type, AccessorTypeParameterMapper, Type> populateImplementationFactory = null, bool addEnumerable = false, AccessorTypeParameterMapper accessorTypeParameterMapper = null) { if (false == implementationTypeDefinition?.IsGenericTypeDefinition) { throw new NotSupportedException($"The implementation type '{implementationTypeDefinition}' only support generic type definition."); } if (!implementationTypeDefinition.IsImplementedInterfaceType(serviceType, out var resultType)) { throw new InvalidOperationException($"The type '{implementationTypeDefinition}' does not implement '{serviceType}' interface."); } var characteristics = GetServiceCharacteristics(serviceType); if (serviceType.IsGenericTypeDefinition) { serviceType = PopulateGenericTypeArguments(serviceType, populateServiceFactory); } var implementationType = PopulateGenericTypeArguments(implementationTypeDefinition, populateImplementationFactory); // 如果不添加为可枚举集合,则尝试移除可能已存在的服务集合 if (!addEnumerable) { Services.TryRemoveAll(serviceType, throwIfNotFound: false); } Services.AddByCharacteristics(serviceType, implementationType, characteristics); return(this); // PopulateGenericTypeArguments Type PopulateGenericTypeArguments(Type populateTypeDefinition, Func <Type, AccessorTypeParameterMapper, Type> populateTypeDefinitionFactory = null) { if (populateTypeDefinitionFactory.IsNull()) { populateTypeDefinitionFactory = (type, mapper) => mapper .PopulateGenericTypeDefinitionByAllMappingWithoutCreatedTime(type); } accessorTypeParameterMapper = accessorTypeParameterMapper ?? AccessorTypeParameterMapper; if (accessorTypeParameterMapper.IsNull()) { throw new InvalidOperationException($"The {nameof(Mappers.AccessorTypeParameterMapper)} is null. You should use the {nameof(AccessorDataBuilderExtensions.AddAccessor)}()."); } return(populateTypeDefinitionFactory.Invoke(populateTypeDefinition, accessorTypeParameterMapper)); } }
/// <summary> /// 构造一个 <see cref="ContentAccessorTypeParameterMapper"/>。 /// </summary> /// <param name="baseMapper">给定的基础访问器 <see cref="AccessorTypeParameterMapper"/>。</param> /// <param name="mappings">给定的 <see cref="TypeParameterMappingCollection"/>。</param> public ContentAccessorTypeParameterMapper(AccessorTypeParameterMapper baseMapper, TypeParameterMappingCollection mappings) : base(mappings) { BaseMapper = baseMapper.NotNull(nameof(baseMapper)); }