• IOC容器特性注入第五篇:查找(Attribute)特性注入


    前面几篇文章分别介绍:程序集反射查找,特性,容器,但它们之间贯穿起来,形成查找Attribute注入IOC容器,就得需要下面这个类帮忙:

    1.DependencyAttributeRegistrator(依赖特性注入类),有它才能在引擎初始化的时候 查找Attribute 进行注入

        public class DependencyAttributeRegistrator {
            #region Fields
    
            private readonly ITypeFinder _finder;
            private readonly IContainerManger _containerManger;
    
            #endregion
    
            #region .ctor
    
            public DependencyAttributeRegistrator(ITypeFinder finder, IContainerManger containerManger)
            {
                this._finder = finder;
                this._containerManger = containerManger;
            }
            #endregion
    
            #region Methods
    
            public virtual IEnumerable<AttributeInfo<DependencyAttribute>> FindServices()
            {
                foreach (Type type in _finder.FindClassesOfType<object>())
                {
                    var attributes = type.GetCustomAttributes(typeof (DependencyAttribute), false); //这句是关键 查找所有特性
                    foreach (DependencyAttribute attribute in attributes)
                    {
                        yield return new AttributeInfo<DependencyAttribute>
                        {
                            Attribute = attribute,
                            DecorateType = type
                        };
                    }
                }
            }
            public virtual void RegisterServices() {
                this.RegisterServices(this.FindServices());
            }
            public virtual void RegisterServices(IEnumerable<AttributeInfo<DependencyAttribute>> services)
            {
                services = services.OrderBy(it => it.Attribute.Order);
                foreach (var info in services)
                {
                    Type serviceType = info.Attribute.ServiceType ?? info.DecorateType;
                    _containerManger.AddComponent(serviceType,info.DecorateType,info.Attribute.Key,info.Attribute.LiftStyle);
                }
            }
    
            public virtual IEnumerable<AttributeInfo<DependencyAttribute>> FilterServices(
                IEnumerable<AttributeInfo<DependencyAttribute>> services, params string[] configurationKeys)
            {
                return services.Where(s => s.Attribute.Configuration == null || configurationKeys.Contains(s.Attribute.Configuration));
            }
            #endregion
        }

    下一篇:

    IOC容器特性注入第六篇:利用MVC注入点,把容器启动

  • 相关阅读:
    什么是 Linux
    Java常用几种加密算法
    Java多线程
    SpringSecurity相关配置【SpringSecurityConfig】
    应用上下文配置【AppConfig】
    web.xml
    Web上下文配置【MvcConfig】
    SpringMVC4零配置--Web上下文配置【MvcConfig】
    HTML <meta> 标签 遇到<meta http-equiv="refresh" content="0; url=">详解
    java如何获取当前机器ip和容器port
  • 原文地址:https://www.cnblogs.com/flyfish2012/p/3781764.html
Copyright © 2020-2023  润新知