internal ICallSite Intern() { ICallSite callSite = this; AssemblyManager.InternNode <ICallSite>(ref callSite); return(callSite); }
protected IServiceBuilder SetCallSite(ICallSite callSite) { if (callSite == null) { throw new ArgumentNullException(nameof(callSite)); } this._callSite = callSite; return(this._builder); }
internal bool FindCallSite(Type expectType, string name, out ICallSite callSite) { ConcurrentDictionary <string, ICallSite> nameCallSites; if (CacheTypeName.TryGetValue(expectType, out nameCallSites) && nameCallSites.TryGetValue(name, out callSite)) { return(true); } callSite = null; return(false); }
internal bool FindCallSite(Type expectType, out ICallSite callSite) { List <ICallSite> callSites; if (CacheType.TryGetValue(expectType, out callSites)) { callSite = callSites.FirstOrDefault(); return(true); } callSite = null; return(false); }
/// <summary> /// 指定预期和实际服务类型,创建一个实例构造器的回调函数。 /// </summary> /// <param name="expectType">预期服务类型。</param> /// <param name="actualType">实际服务类型。</param> /// <returns>实例构造器委托。</returns> internal InstanceCreatorCallback CreateCallback(Type expectType, Type actualType) { this.TestActualType(actualType); var ctors = actualType.GetConstructors(Aoite.Reflection.Flags.InstanceAnyVisibility); if (ctors.Length > 1) { ctors = ctors.OrderBy(ctor => ctor.GetAttribute <OrderMappingAttribute>()?.Order ?? 0).ToArray(); } var hasExpectedType = expectType != actualType; List <Exception> exceptions = new List <Exception>(); foreach (var ctor in ctors) { var ps = ctor.GetParameters(); if (ps.Length == 0) { return(lmvs => Activator.CreateInstance(actualType, true)); } var callSites = new ICallSite[ps.Length]; for (int i = 0, lastMappingIndex = 0; i < ps.Length; i++) { var p = ps[i]; var pType = p.ParameterType; var isSimpleType = pType.IsSimpleType(); var pName = p.Name; ICallSite callSite = null; if (p.IsDefined(LastMappingAttribute.Type, true) || (pType.IsDefined(LastMappingAttribute.Type, true) && !p.IsDefined(IgnoreAttribute.Type, true))) { callSite = new LastMappingCallSite(actualType, p, lastMappingIndex++); } else if (!this.FindParameterCallSite(expectType, actualType, pType, pName, hasExpectedType, isSimpleType, out callSite)) { exceptions.Add(new ArgumentException($"实际服务类型{actualType.FullName}():构造函数的参数“{pName}”尚未配置映射,并且自动分析失败。", pName)); callSites = null; break; } callSites[i] = callSite; } if (callSites != null) { var ctorHandler = DynamicFactory.CreateConstructorHandler(ctor); return(lmps => ctorHandler(callSites.Each(cs => cs.Invoke(lmps)))); } } throw new AggregateException(actualType.FullName + "没有在映射列表中找到匹配的构造函数。错误内容可以详见 System.Exception.Data 字典。", exceptions); }
internal bool FindCallSite(string name, out ICallSite callSite) { return(this.FindCallSite(EmptyType, name, out callSite)); }
//- 查找指定容器的所有上级链中符合条件的构造函数参数的 CallSite,如果都找不到,尝试智能解析 private bool FindParameterCallSite(Type expectType, Type actualType, Type pType, string pName, bool hasExpectedType, bool isSimpleType, out ICallSite callSite) { if (FindParameterCallSite(this, expectType, actualType, pType, pName, hasExpectedType, isSimpleType, out callSite)) { return(true); } //- 简单类型不进行【关联实际服务类型】和【智能解析实际服务类型】 if (!isSimpleType) { var parameterActualType = this.FindActualType(pType); if (parameterActualType == null) { return(false); } if (FindParameterCallSite(this, expectType, actualType, parameterActualType, pName, hasExpectedType, isSimpleType, out callSite)) { return(true); } if (!this.DisabledAutoResolving) { callSite = this.AutoResolving(pType, parameterActualType); return(callSite != null); } } return(false); }
//- 查找指定容器的所有上级链中符合条件的构造函数参数的 CallSite private static bool FindParameterCallSite(IocContainer container, Type expectType, Type actualType, Type pType, string pName, bool hasExpectedType, bool isSimpleType, out ICallSite callSite) { do { //- 优先级1:实际的服务类型+参数名 if (container.FindCallSite(actualType, pName, out callSite)) { return(true); } //- 优先级2:预期的服务类型+参数名 if (hasExpectedType && container.FindCallSite(expectType, pName, out callSite)) { return(true); } //- 优先级3:参数名 if (container.FindCallSite(pName, out callSite)) { return(true); } //- 优先级4:参数类型 if (!isSimpleType && container.FindCallSite(pType, out callSite)) { return(true); } } while(container._hasParent && (container = container.Parent) != null); return(false); }
internal ReferencedFunctionPointer(AssemblyManager assemblyManager, ICallSite callSite) : base(assemblyManager) { _callSite = callSite; }
protected IServiceBuilder SetCallSite(ICallSite callSite) { if(callSite == null) throw new ArgumentNullException(nameof(callSite)); this._callSite = callSite; return this._builder; }
public IType MakeFunctionPointerType(ICallSite callSite) { return((new ReferencedFunctionPointer(this, callSite)).Intern()); }