/// <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); }
/// <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); } } }
/// <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)); }
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); }
/// <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); }
/// <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()); }
/// <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); }
/// <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)); }
/// <summary>解决非类类型</summary> /// <param name="info">参数信息</param> /// <returns></returns> private object ResolveNonClass(CBindData bindData, Type parent, ParameterInfo info) { return(info.DefaultValue); }
/// <summary>解决非类类型</summary> /// <param name="type">参数类型</param> /// <param name="alias">别名</param> /// <returns></returns> private object ResolveNonClassAttr(CBindData bindData, Type parent, string cls) { return(null); }
public TmpData(CBindData bindData, string needs) { this.bindData = bindData; this.needs = needs; }