private Object[] GetParameters(IResolverContext context, IDependencyTable dependencyTable, IDependencyResolver resolver)
 {
     return context.HasImplementationDelegate() ?
             new Object[0] :
             context.DependencyEntry.GetImplementationType().
             GetConstructorParameters(_dependencyTable, resolver);
 }
 private Object[] GetParameters(IResolverContext context, IDependencyTable dependencyTable, IDependencyResolver resolver)
 {
     return(context.HasImplementationDelegate() ?
            new Object[0] :
            context.DependencyEntry.GetImplementationType().
            GetConstructorParameters(_dependencyTable, resolver));
 }
Exemplo n.º 3
0
 internal static Object[] GetConstructorParameters(this Type type, IDependencyTable dependencyTable, IDependencyResolver resolver)
 {
     return(type.GetBastConstructor(dependencyTable).
            GetParameters().
            Select(p => resolver.Resolve(p.ParameterType)).
            ToArray());
 }
 public SingletonResolverCallSite(IDependencyTable dependencyTable)
 {
     if (dependencyTable == null)
     {
         throw new ArgumentNullException(nameof(dependencyTable));
     }
     _dependencyTable = dependencyTable;
 }
Exemplo n.º 5
0
 public DependencyResolver(IDependencyTable dependencyTable)
 {
     if (dependencyTable == null)
     {
         throw new ArgumentNullException(nameof(dependencyTable));
     }
     _dependencyTable = dependencyTable;
     CallSiteCollection.AddDefault(_dependencyTable);
 }
Exemplo n.º 6
0
 public DependencyResolver(IEnumerable <DependencyEntry> dependencyEntrys)
 {
     if (dependencyEntrys == null)
     {
         throw new ArgumentNullException(nameof(dependencyEntrys));
     }
     _dependencyTable = new DependencyTable(dependencyEntrys);
     CallSiteCollection.AddDefault(_dependencyTable);
 }
 /// <summary>
 /// 添加默认解析器实现
 /// </summary>
 internal static ICallSiteCollection AddDefault(this ICallSiteCollection callSiteCollection, IDependencyTable dependencyTable)
 {
     callSiteCollection.Add(new PropertyResolverCallSite(dependencyTable));
     callSiteCollection.Add(new CompileResolverCallSite(dependencyTable));
     callSiteCollection.Add(new ConstructorResolverCallSite(dependencyTable));
     callSiteCollection.Add(new NonConstructorResolverCallSite());
     callSiteCollection.Add(new InstanceResolverCallSite());
     callSiteCollection.Add(new DelegateResolverCallSite());
     callSiteCollection.Add(new ScopedResolverCallSite(dependencyTable));
     callSiteCollection.Add(new SingletonResolverCallSite(dependencyTable));
     callSiteCollection.Add(new TransientResolverCallSite(dependencyTable));
     return callSiteCollection;
 }
        /// <summary>
        /// 获取或添加委托缓存
        /// </summary>
        internal static Func <IDependencyResolver, Object[], Object> GetOrAddCompile(this IDependencyTable dependencyTable,
                                                                                     DependencyEntry depencyEntry, Func <Type, Type, Func <IDependencyResolver, Object[], Object> > valueFactory)
        {
            if (depencyEntry == null)
            {
                throw new ArgumentNullException(nameof(depencyEntry));
            }

            Func <IDependencyResolver, Object[], Object> resultingValue;

            if (dependencyTable.CompileTable.TryGetValue(depencyEntry, out resultingValue))
            {
                return(resultingValue);
            }
            return(dependencyTable.CompileTable[depencyEntry] = valueFactory(depencyEntry.ServiceType, depencyEntry.GetImplementationType()));
        }
        /// <summary>
        /// 从缓存中读取委托并调用
        /// </summary>
        internal static bool TryGetCompileValue(this IDependencyTable dependencyTable, IResolverContext context, IDependencyResolver resolver)
        {
            Func <IDependencyResolver, Object[], Object> resultingValueFactory;

            if (dependencyTable.CompileTable.TryGetValue(context.DependencyEntry, out resultingValueFactory))
            {
                var args = context.DependencyEntry.GetImplementationType().
                           GetConstructorParameters(dependencyTable, resolver);
                context.CompleteValue = resultingValueFactory(resolver, args);
                if (dependencyTable.HasPropertyEntryTable.ContainsKey(context.DependencyEntry))
                {
                    new PropertyResolverCallSite(dependencyTable).Resolver(context, resolver);
                }
            }
            return(context.Complete);
        }
Exemplo n.º 10
0
        /// <summary>
        /// 返回最佳构造方法
        /// </summary>
        internal static ConstructorInfo GetBastConstructor(this Type type, IDependencyTable dependencyTable)
        {
            var constructors = type.GetConstructors().OrderBy(ctor => ctor.GetParameters().Length).ToArray();

            if (constructors.Length == 0)
            {
                throw new InvalidOperationException(type.FullName + "类没有公共的构造方法。");
            }
            else if (constructors.Length == 1)
            {
                return(constructors[0]);
            }
            else
            {
                ConstructorInfo bestConstructor = null;
                foreach (var constructor in constructors)
                {
                    if (!constructor.GetParameterTypes().Any(t => !dependencyTable.DependencyEntryTable.ContainsKey(t)))
                    {
                        if (bestConstructor == null)
                        {
                            bestConstructor = constructor;
                        }
                        else
                        {
                            if (bestConstructor.GetParameters().Length == constructor.GetParameters().Length)
                            {
                                throw new InvalidOperationException("类型\"" + type.FullName + "\" 构造方法调用不明确。");
                            }
                            bestConstructor = constructor;
                        }
                    }
                }
                if (bestConstructor == null)
                {
                    throw new InvalidOperationException("类型\"" + type.FullName + "\"未找到合适的构造方法。");
                }
                return(bestConstructor);
            }
            throw new InvalidOperationException("类型\"" + type.FullName + "\"未找到合适的构造方法。");
        }
Exemplo n.º 11
0
 /// <summary>
 /// 返回最佳构造方法
 /// </summary>
 internal static ConstructorInfo GetBastConstructor(this Type type, IDependencyTable dependencyTable)
 {
     var constructors = type.GetConstructors().OrderBy(ctor => ctor.GetParameters().Length).ToArray();
     if (constructors.Length == 0)
     {
         throw new InvalidOperationException(type.FullName + "类没有公共的构造方法。");
     }
     else if (constructors.Length == 1)
     {
         return constructors[0];
     }
     else
     {
         ConstructorInfo bestConstructor = null;
         foreach (var constructor in constructors)
         {
             if (!constructor.GetParameterTypes().Any(t => !dependencyTable.DependencyEntryTable.ContainsKey(t)))
             {
                 if (bestConstructor == null)
                 {
                     bestConstructor = constructor;
                 }
                 else
                 {
                     if (bestConstructor.GetParameters().Length == constructor.GetParameters().Length)
                     {
                         throw new InvalidOperationException("类型\"" + type.FullName + "\" 构造方法调用不明确。");
                     }
                     bestConstructor = constructor;
                 }
             }
         }
         if (bestConstructor == null)
         {
             throw new InvalidOperationException("类型\"" + type.FullName + "\"未找到合适的构造方法。");
         }
         return bestConstructor;
     }
     throw new InvalidOperationException("类型\"" + type.FullName + "\"未找到合适的构造方法。");
 }
 public SingletonResolverCallSite(IDependencyTable dependencyTable)
 {
     if (dependencyTable == null) throw new ArgumentNullException(nameof(dependencyTable));
     _dependencyTable = dependencyTable;
 }
Exemplo n.º 13
0
 public Kernel(IDependencyTable dependencyTable)
 {
     _dependencyTable = dependencyTable;
 }
Exemplo n.º 14
0
 internal static Object[] GetConstructorParameters(this Type type, IDependencyTable dependencyTable, IDependencyResolver resolver)
 {
     return type.GetBastConstructor(dependencyTable).
             GetParameters().
             Select(p => resolver.Resolve(p.ParameterType)).
             ToArray();
 }
Exemplo n.º 15
0
 /// <summary>
 /// 添加默认解析器实现
 /// </summary>
 internal static ICallSiteCollection AddDefault(this ICallSiteCollection callSiteCollection, IDependencyTable dependencyTable)
 {
     callSiteCollection.Add(new PropertyResolverCallSite(dependencyTable));
     callSiteCollection.Add(new CompileResolverCallSite(dependencyTable));
     callSiteCollection.Add(new ConstructorResolverCallSite(dependencyTable));
     callSiteCollection.Add(new NonConstructorResolverCallSite());
     callSiteCollection.Add(new InstanceResolverCallSite());
     callSiteCollection.Add(new DelegateResolverCallSite());
     callSiteCollection.Add(new ScopedResolverCallSite(dependencyTable));
     callSiteCollection.Add(new SingletonResolverCallSite(dependencyTable));
     callSiteCollection.Add(new TransientResolverCallSite(dependencyTable));
     return(callSiteCollection);
 }
 internal static void AddScoped(this IDependencyTable dependencyTable, IResolverContext context, IDependencyResolver resolver)
 {
     dependencyTable.ScopedTable.Add(DependencyTableHelper.GetScopedKey(context, resolver), context.CompleteValue);
 }
 /// <summary>
 /// 从缓存中读取作用域值
 /// </summary>
 internal static bool TryGetScoped(this IDependencyTable dependencyTable, IResolverContext context, IDependencyResolver resolver, out Object value)
 {
     return(dependencyTable.ScopedTable.TryGetValue(DependencyTableHelper.GetScopedKey(context, resolver), out value));
 }