public void Resolver(IResolverContext context, IDependencyResolver resolver)
        {
            var properties = PropertyCacheManager.GetOrSetCache(context.Dependency,
                                                                () =>
                                                                context.Resolved.GetType().
                                                                GetProperties(BindingFlags.Public | BindingFlags.Instance).
                                                                Where(property => DependencyCacheManager.GetCache((IScopedResolver)resolver).
                                                                      Any(dependency => property.PropertyType == dependency.ServiceType) &&
                                                                      !property.IsDefined(typeof(IgnoreDependencyAttribute), false)));

            foreach (var property in properties)
            {
                try
                {
                    PropertySetCacheManger.Cache(property, context.Resolved, resolver.Resolve(property.PropertyType));
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException(
                              $"类型\"{context.Dependency.GetImplementationType()}\"未能注入属性\"{property.PropertyType}\"的实例。",
                              ex);
                }
            }
            context.Handled = true;
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 解析服务
        /// </summary>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="InvalidOperationException"></exception>
        public object Resolve(Type serviceType)
        {
            if (serviceType == null)
            {
                throw new ArgumentNullException(nameof(serviceType));
            }
            var dependency = DependencyCacheManager.GetCache(this, serviceType);

            if (dependency == null)
            {
                throw new InvalidOperationException($"尝试解析未注册的类型\"{serviceType.FullName}\"失败。");
            }
            return(BuildUp(new ResolverContext(dependency.Last)));
        }
Ejemplo n.º 3
0
        /// <summary>
        ///     返回最佳构造方法
        /// </summary>
        /// <exception cref="InvalidOperationException"></exception>
        internal static ConstructorInfo GetBastConstructor(Type type, IDependencyResolver resolver)
        {
            var constructors = type.GetConstructors().OrderBy(ctor => ctor.GetParameters().Length).ToArray();

            switch (constructors.Length)
            {
            case 0:
                throw new InvalidOperationException(type.FullName + "类没有公共的构造方法。");

            case 1:
                return(constructors[0]);

            default:
                ConstructorInfo bestConstructor = null;
                foreach (
                    var constructor in
                    constructors.Where(
                        constructor =>
                        constructor.GetParameterTypes()
                        .All(
                            t =>
                            DependencyCacheManager.GetCache((IScopedResolver)resolver, t) !=
                            null)))
                {
                    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 + "\"未找到合适的构造方法。");
        }
Ejemplo n.º 4
0
 /// <summary>
 ///     解析服务集合
 /// </summary>
 /// <exception cref="ArgumentNullException"></exception>
 /// <exception cref="InvalidOperationException"></exception>
 public IEnumerable <object> ResolveAll(Type serviceType)
 {
     if (serviceType == null)
     {
         throw new ArgumentNullException(nameof(serviceType));
     }
     if (serviceType.IsGenericTypeDefinition)
     {
         var serviceTypes = DependencyCacheManager.GetCache(this).
                            Where(e => e.ServiceType.GetGenericTypeDefinitions().
                                  Any(genericType => genericType == serviceType)).
                            Select(e => e.ServiceType).ToArray();
         foreach (var dependency in serviceTypes.Select(type => DependencyCacheManager.GetCache(this, type)))
         {
             if (dependency == null)
             {
                 throw new InvalidOperationException($"尝试解析未注册的类型\"{serviceType.FullName}\"失败。");
             }
             foreach (var e in dependency.Chain())
             {
                 yield return(BuildUp(new ResolverContext(e)));
             }
         }
     }
     else
     {
         var dependency = DependencyCacheManager.GetCache(this, serviceType);
         if (dependency == null)
         {
             throw new InvalidOperationException($"尝试解析未注册的类型\"{serviceType.FullName}\"失败。");
         }
         foreach (var e in dependency.Chain())
         {
             yield return(BuildUp(new ResolverContext(e)));
         }
     }
 }
Ejemplo n.º 5
0
 /// <summary>
 ///     创建作用域解析器
 /// </summary>
 /// <returns></returns>
 public IScopedResolver CreateScopedResolver()
 => new DependencyResolver(RootScoped, DependencyCacheManager.GetCache(this));
Ejemplo n.º 6
0
 public void Dispose()
 {
     ScopedKeyCacheManager.RemoveCache(this);
     DependencyCacheManager.RemoveCache(this);
     CallSiteCacheManager.RemoveCache(this);
 }
Ejemplo n.º 7
0
 private DependencyResolver(IScopedResolver root, IEnumerable <Dependency> dependencyEntries)
 {
     RootScoped = root;
     DependencyCacheManager.SetCache(this, dependencyEntries);
     InitializationCallSite();
 }
Ejemplo n.º 8
0
 public DependencyResolver(IEnumerable <Dependency> dependencyEntries)
 {
     RootScoped = this;
     DependencyCacheManager.SetCache(this, dependencyEntries);
     InitializationCallSite();
 }