예제 #1
0
        /// <summary>解决类类型</summary>
        /// <param name="bindData"></param>
        /// <param name="parent"></param>
        /// <param name="info">参数信息</param>
        /// <returns></returns>
        private object ResloveClass(CBindData bindData, Type parent, ParameterInfo info)
        {
            object obj = null;

            if (info.ParameterType == typeof(CConfig))
            {
                if (config == null)
                {
                    this.InitConfig();
                }
                if (config.ContainsKey(parent))
                {
                    obj = config[parent];
                }
            }
            else
            {
                obj = this.Make(bindData.GetContextual(info.ParameterType.ToString()), null);
            }

            if (obj == null)
            {
                return(info.DefaultValue);
            }
            return(obj);
        }
예제 #2
0
        /// <summary>属性注入</summary>
        /// <param name="cls"></param>
        private void DIAttr(CBindData bindData, object cls)
        {
            if (cls == null)
            {
                return;
            }

            foreach (PropertyInfo property in cls.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                if (!property.CanWrite)
                {
                    continue;
                }
                object[] propertyAttrs = property.GetCustomAttributes(typeof(CDependency), true);
                if (propertyAttrs.Length <= 0)
                {
                    continue;
                }
                CDependency dependency = propertyAttrs[0] as CDependency;

                if (property.PropertyType.IsClass || property.PropertyType.IsInterface)
                {
                    property.SetValue(cls, ResloveClassAttr(bindData, cls.GetType(), property.PropertyType.ToString()), null);
                }
                else
                {
                    property.SetValue(cls, ResolveNonClassAttr(bindData, cls.GetType(), property.PropertyType.ToString()), null);
                }
            }
        }
예제 #3
0
        /// <summary>
        /// 常规编译
        /// </summary>
        /// <param name="bindData"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        private object NormalBuild(CBindData bindData, object[] param)
        {
            if (bindData.Concrete != null)
            {
                return(bindData.Concrete(this, param));
            }

            return(Build(bindData, bindData.Service, param));
        }
예제 #4
0
 private object ExecDecorator(CBindData bindData, object obj)
 {
     if (decorator != null)
     {
         foreach (Func <IContainer, IBindData, object, object> func in decorator)
         {
             obj = func(this, bindData, obj);
         }
     }
     return(obj);
 }
예제 #5
0
        /// <summary>
        /// 绑定一个服务
        /// </summary>
        /// <param name="service">服务名</param>
        /// <param name="concrete">服务实体</param>
        /// <param name="isStatic">服务是否静态化</param>
        /// <returns></returns>
        public IBindData Bind(string service, Func <IContainer, object[], object> concrete, bool isStatic)
        {
            service = Normalize(service);

            instances.Remove(service);
            alias = alias.RemoveValue(service);
            alias.Remove(service);

            CBindData bindData = new CBindData(this, service, concrete, isStatic);

            binds.Add(service, bindData);

            return(bindData);
        }
예제 #6
0
        /// <summary>获取依赖关系</summary>
        /// <param name="type">类型</param>
        /// <param name="paramInfo">参数信息</param>
        /// <param name="param">手动输入的参数</param>
        /// <returns></returns>
        private object[] GetDependencies(CBindData bindData, Type type, List <ParameterInfo> paramInfo, object[] param)
        {
            List <object> myParam = new List <object>(param);

            foreach (ParameterInfo info in paramInfo)
            {
                if (info.ParameterType.IsClass || info.ParameterType.IsInterface)
                {
                    myParam.Add(ResloveClass(bindData, type, info));
                }
                else
                {
                    myParam.Add(ResolveNonClass(bindData, type, info));
                }
            }

            return(myParam.ToArray());
        }
예제 #7
0
        /// <summary>解决类类型</summary>
        /// <returns></returns>
        private object ResloveClassAttr(CBindData bindData, Type parent, string cls)
        {
            object obj = null;

            if (cls == typeof(CConfig).ToString())
            {
                if (config == null)
                {
                    this.InitConfig();
                }
                if (config.ContainsKey(parent))
                {
                    obj = config[parent];
                }
            }
            else
            {
                obj = Make(bindData.GetContextual(cls));
            }

            return(obj);
        }
예제 #8
0
        /// <summary>构造服务</summary>
        /// <param name="type"></param
        /// <param name="bindData"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        private object Build(CBindData bindData, string service, object[] param)
        {
            if (param == null)
            {
                param = new object[] { };
            }
            Type type = Type.GetType(bindData.Service);

            if (type.IsAbstract || type.IsInterface)
            {
                if (service != bindData.Service)
                {
                    type = Type.GetType(service);
                }
                else
                {
                    return(null);
                }
            }
            ConstructorInfo[] constructor = type.GetConstructors();
            if (constructor.Length <= 0)
            {
                return(Activator.CreateInstance(type));
            }

            List <ParameterInfo> parameter = new List <ParameterInfo>(constructor[constructor.Length - 1].GetParameters());

            parameter.RemoveRange(0, param.Length);

            if (parameter.Count > 0)
            {
                param = GetDependencies(bindData, type, parameter, param);
            }

            return(Activator.CreateInstance(type, param));
        }
예제 #9
0
 /// <summary>解决非类类型</summary>
 /// <param name="info">参数信息</param>
 /// <returns></returns>
 private object ResolveNonClass(CBindData bindData, Type parent, ParameterInfo info)
 {
     return(info.DefaultValue);
 }
예제 #10
0
 /// <summary>解决非类类型</summary>
 /// <param name="type">参数类型</param>
 /// <param name="alias">别名</param>
 /// <returns></returns>
 private object ResolveNonClassAttr(CBindData bindData, Type parent, string cls)
 {
     return(null);
 }
예제 #11
0
 public TmpData(CBindData bindData, string needs)
 {
     this.bindData = bindData;
     this.needs    = needs;
 }