コード例 #1
0
        /// <summary>
        /// 添加领域泛型扩展。
        /// </summary>
        /// <param name="domainProvider">领域服务提供器。</param>
        /// <param name="serviceDefinitionType">领域服务泛型定义类型。</param>
        /// <param name="extensionDefinitionType">领域扩展泛型定义类型。</param>
        public static void AddGenericDefinitionExtension(this IDomainServiceProvider domainProvider, Type serviceDefinitionType, Type extensionDefinitionType)
        {
            if (domainProvider == null)
            {
                throw new ArgumentNullException(nameof(domainProvider));
            }
            if (!typeof(IDomainService).IsAssignableFrom(serviceDefinitionType))
            {
                throw new ArgumentException("不是领域服务类型。", nameof(serviceDefinitionType));
            }
            if (!typeof(IDomainExtension).IsAssignableFrom(extensionDefinitionType))
            {
                throw new ArgumentException("不是领域扩展类型。", nameof(serviceDefinitionType));
            }
            if (!serviceDefinitionType.GetTypeInfo().IsGenericTypeDefinition)
            {
                throw new ArgumentException("仅支持泛型定义类型。。", nameof(serviceDefinitionType));
            }
            if (!extensionDefinitionType.GetTypeInfo().IsGenericTypeDefinition)
            {
                throw new ArgumentException("仅支持泛型定义类型。。", nameof(extensionDefinitionType));
            }
            var serviceConstraints   = serviceDefinitionType.GetTypeInfo().GenericTypeParameters;
            var extensionConstraints = extensionDefinitionType.GetTypeInfo().GenericTypeParameters;

            if (serviceConstraints.Length != extensionConstraints.Length)
            {
                throw new ArgumentException("领域服务类型与领域扩展类型的泛型数量不一致。");
            }
            //for (int i = 0; i < serviceConstraints.Length; i++)
            //{
            //    if (extensionConstraints[i].GetTypeInfo().GetGenericParameterConstraints().Any(t => !t.IsAssignableFrom(serviceConstraints[i])))
            //        throw new ArgumentException("领域服务第" + i + "个泛型约束不满足领域扩展泛型约束。");
            //}
            domainProvider.AddExtensionSelector(type =>
            {
                if (!type.GetTypeInfo().IsGenericType)
                {
                    return(null);
                }
                if (type.GetGenericTypeDefinition() != serviceDefinitionType)
                {
                    return(null);
                }
                try
                {
                    var extensionType = extensionDefinitionType.MakeGenericType(type.GetGenericArguments());
                    return(extensionType);
                }
                catch
                {
                    return(null);
                }
            });
        }
コード例 #2
0
 /// <summary>
 /// 添加领域扩展。
 /// </summary>
 /// <param name="domainProvider">领域服务提供器。</param>
 /// <param name="serviceType">领域服务类型。(支持子类绑定。)</param>
 /// <param name="extensionType">领域扩展类型。</param>
 public static void AddExtension(this IDomainServiceProvider domainProvider, Type serviceType, Type extensionType)
 {
     if (domainProvider == null)
     {
         throw new ArgumentNullException(nameof(domainProvider));
     }
     if (!typeof(IDomainService).IsAssignableFrom(serviceType))
     {
         throw new ArgumentException("不是领域服务类型。", nameof(serviceType));
     }
     if (!typeof(IDomainExtension).IsAssignableFrom(extensionType))
     {
         throw new ArgumentException("不是领域扩展类型。", nameof(serviceType));
     }
     if (serviceType.GetTypeInfo().IsGenericTypeDefinition)
     {
         throw new ArgumentException("不支持泛型定义类型。。", nameof(serviceType));
     }
     if (extensionType.GetTypeInfo().IsGenericTypeDefinition)
     {
         throw new ArgumentException("不支持泛型定义类型。。", nameof(extensionType));
     }
     domainProvider.AddExtensionSelector(t => serviceType.IsAssignableFrom(t) ? extensionType : null);
 }