示例#1
0
        /// <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));
        }
示例#2
0
        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));
            }
        }
示例#3
0
 /// <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));
 }