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;
        }
Example #2
0
        public void Resolver(IResolverContext context, IDependencyResolver resolver)
        {
            var args = context.HasImplementationType() && context.HasPublicConstructor()
                ? ResolverHelper.GetConstructorParameters(
                context.Dependency.GetImplementationType(), resolver)
                : ArrayExtends.Empty <object>();

            context.Resolved = CompileCacheManager.GetCache(context.Dependency, resolver, args);

            context.Handled = context.Resolved != null && !PropertyCacheManager.Any(context.Dependency);
        }