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)); }
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; }
public DependencyResolver(IDependencyTable dependencyTable) { if (dependencyTable == null) { throw new ArgumentNullException(nameof(dependencyTable)); } _dependencyTable = dependencyTable; CallSiteCollection.AddDefault(_dependencyTable); }
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); }
/// <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 + "\"未找到合适的构造方法。"); }
/// <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; }
public Kernel(IDependencyTable dependencyTable) { _dependencyTable = dependencyTable; }
internal static Object[] GetConstructorParameters(this Type type, IDependencyTable dependencyTable, IDependencyResolver resolver) { return type.GetBastConstructor(dependencyTable). GetParameters(). Select(p => resolver.Resolve(p.ParameterType)). ToArray(); }
/// <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)); }