/// <summary>
        /// 创建对象,可以是未在容器注册
        /// </summary>
        /// <param name="serviceType">服务类型</param>
        /// <returns></returns>
        public RegisterRule CreateRule(Type serviceType)
        {
            var rule = this.QueryRule(serviceType, string.Empty, false);

            if (rule != null)
            {
                return(rule);
            }

            if (!RegisterRuleCollector.TryRule(serviceType, serviceType))
            {
                return(null);
            }

            lock (locker)
            {
                rule = this.QueryRule(serviceType, string.Empty, false);
                if (rule != null)
                {
                    return(rule);
                }

                var containerRule = new RegisterRuleCollector();
                containerRule.RegisterType(serviceType, serviceType);
                this.Update(containerRule);
                return(containerRule.Rules[0]);
            }
        }
Example #2
0
        /// <summary>
        /// 注册中间件与接口映射关系
        /// </summary>
        /// <param name="implementationType">继承TSservice对象的具体对象</param>
        /// <param name="serviceType">服务类型</param>
        /// <param name="key">key</param>
        /// <param name="lifeStyle">生命周期</param>
        public void RegisterType(Type implementationType, Type serviceType, string key, ComponentLifeStyle lifeStyle)
        {
            if (this.option.Value.Unabled)
            {
                throw new InvalidException("the builder is builded,can not update rules");
            }

            var rule = new RegisterRuleCollector(1);

            rule.RegisterType(implementationType, serviceType, key, lifeStyle);
            register.Update(rule);
        }
        /// <summary>
        /// 查询规则
        /// </summary>
        /// <param name="serviceType"></param>
        /// <param name="key"></param>
        /// <param name="throw">是否throw异常</param>
        /// <returns></returns>
        public RegisterRule QueryRule(Type serviceType, string key, bool @throw)
        {
            var rule = this.QueryForObject(serviceType, key);

            if (rule != null)
            {
                return(rule);
            }

            if (serviceType.IsArray)
            {
                var typeTemp = typeof(ConstructorList <>).MakeGenericType(serviceType.GetElementType());
                rule = this.QueryForObject(typeTemp, key);
                if (rule != null)
                {
                    return(rule);
                }

                lock (locker)
                {
                    var containerRule = new RegisterRuleCollector(1);
                    var registerRule  = (RegisterRule)containerRule.RegisterArrayType(typeTemp, serviceType, key, ComponentLifeStyle.Scoped);
                    /*更新容器*/
                    this.Update(containerRule);
                    return(registerRule);
                }
            }

            if (!serviceType.IsGenericType)
            {
                if (!@throw)
                {
                    return(null);
                }

                if (string.IsNullOrEmpty(key))
                {
                    throw new ArgumentNullException(string.Format("{0} not registed", serviceType.FullName));
                }

                throw new ArgumentNullException(string.Format("{0} with key {1} not registed", serviceType.FullName, key));
            }

            rule = this.QueryForObject(serviceType.GetGenericTypeDefinition(), key);
            if (rule == null)
            {
                if (!@throw)
                {
                    return(null);
                }

                if (string.IsNullOrEmpty(key))
                {
                    throw new ArgumentNullException(string.Format("{0} not registed", serviceType.GetGenericTypeDefinition().FullName));
                }

                throw new ArgumentNullException(string.Format("{0} with key {1} not registed", serviceType.FullName, key));
            }

            lock (locker)
            {
                var ruletemp = this.QueryForObject(rule.ServiceType.MakeGenericType(serviceType.GetGenericArguments()), key);
                if (ruletemp != null)
                {
                    return(ruletemp);
                }

                var containerRule = new RegisterRuleCollector(1);
                var registerRule  = (RegisterRule)containerRule.RegisterType(rule.ImplementationType.MakeGenericType(serviceType.GetGenericArguments()), rule.ServiceType.MakeGenericType(serviceType.GetGenericArguments()), key, rule.LifeStyle);
                if (rule.ParametersCount > 0)
                {
                    registerRule.PasteParameters(rule);
                }

                /*更新容器*/
                this.Update(containerRule);

                return(registerRule);
            }
        }