Exemplo n.º 1
0
        /// <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]);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 更新容器规则
        /// </summary>
        /// <param name="collector"></param>
        public void Update(RegisterRuleCollector collector)
        {
            if (option != null && option.Value.Unabled)
            {
                return;
            }

            this.AlwayUpdate(collector);
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
0
        /// <summary>
        /// 注册对象实例映射关系
        /// </summary>
        /// <typeparam name="TService">服务类型</typeparam>
        /// <param name="mission">回调生成</param>
        /// <param name="key">key</param>
        /// <param name="lifeStyle">生命周期</param>
        /// <returns></returns>
        public void RegisterCallBack <TService>(string key, ComponentLifeStyle lifeStyle, Func <ILifetimeScope, TService> mission)
        {
            if (this.option.Value.Unabled)
            {
                throw new InvalidException("the builder is builded,can not update rules");
            }

            var rule = new RegisterRuleCollector(1);

            rule.RegisterCallBack(key, lifeStyle, mission);
            register.Update(rule);
        }
Exemplo n.º 5
0
        /// <summary>
        /// 注册对象实例映射关系
        /// </summary>
        /// <param name="instance">服务对象</param>
        /// <param name="serviceType">服务类型</param>
        /// <param name="key">key</param>
        public void RegisterInstance(object instance, Type serviceType, string key)
        {
            if (this.option.Value.Unabled)
            {
                throw new InvalidException("the builder is builded,can not update rules");
            }

            var rule = new RegisterRuleCollector(1);

            rule.RegisterInstance(instance, serviceType, key);
            register.Update(rule);
        }
Exemplo n.º 6
0
        /// <summary>
        /// 更新容器规则
        /// </summary>
        /// <param name="collector"></param>
        public void AlwayUpdate(RegisterRuleCollector collector)
        {
            lock (locker)
            {
                foreach (var r in collector.Rules)
                {
                    this.rules.Add(r);
                }

                /*子注册规则*/
                foreach (var r in collector.Rules)
                {
                    var subRules = r.SubRuleQueue;
                    if (subRules == null || subRules.Count == 0)
                    {
                        continue;
                    }

                    foreach (var sr in subRules)
                    {
                        this.rules.Add(sr);
                    }

                    subRules.Clear();
                }

                var proxyRules = new List <RegisterRule>(collector.Rules.Count);
                foreach (var r in collector.Rules)
                {
                    if (r.ProxyImplementationType == null & r.ProxyParameters.Length <= 0)
                    {
                        continue;
                    }

                    //if (r.ProxyParameters.Length <= 0)
                    //    continue;

                    var interceptors = new List <Type>(r.ProxyParameters.Length);
                    foreach (var p in r.ProxyParameters)
                    {
                        interceptors.Add(p.Value);
                    }

                    var implementationType = r.ProxyImplementationType == null ? new MyProxyMockBuilder().Build(r.ImplementationType, r.ServiceType, interceptors.ToArray(), r.ProxySetting) : r.ProxyImplementationType;
                    var proxyRule          = new RegisterRule(implementationType, r.ServiceType, string.Empty, r.ProxyParameters.Length > 0 ? ComponentLifeStyle.Transient : r.LifeStyle);

                    var paramters = new List <KeyValueTuple <string, Type> >(r.ProxyParameters.Length + 1);
                    paramters.AddRange(r.ProxyParameters);
                    paramters.AddRange(new[] { new KeyValueTuple <string, Type>(r.Key, r.ServiceType) });
                    proxyRule.PasteParameters(paramters.ToArray());

                    proxyRules.Add(proxyRule);
                }

                foreach (var r in proxyRules)
                {
                    this.rules.Add(r);
                }

                return;
            }
        }
Exemplo n.º 7
0
        /// <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);
            }
        }