Пример #1
0
        internal ICallSite Intern()
        {
            ICallSite callSite = this;

            AssemblyManager.InternNode <ICallSite>(ref callSite);

            return(callSite);
        }
Пример #2
0
 protected IServiceBuilder SetCallSite(ICallSite callSite)
 {
     if (callSite == null)
     {
         throw new ArgumentNullException(nameof(callSite));
     }
     this._callSite = callSite;
     return(this._builder);
 }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
 internal bool FindCallSite(string name, out ICallSite callSite)
 {
     return(this.FindCallSite(EmptyType, name, out callSite));
 }
Пример #7
0
        //- 查找指定容器的所有上级链中符合条件的构造函数参数的 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);
        }
Пример #8
0
 //- 查找指定容器的所有上级链中符合条件的构造函数参数的 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;
 }
Пример #10
0
 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());
 }