zoukankan      html  css  js  c++  java
  • 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注入点,把容器启动

  • 相关阅读:
    php注释规范
    Jquery元素选取、常用方法
    pdo 添加数据
    pdo 访问数据库
    session / cookie 区别与应用
    注册审核
    分页 --条件查询再分页
    Python 第二十九章 socket通信
    Python 第二十八章 网络初识+五层协议+三次握手四次挥手
    Python 第二十六章 面向对象 元类+反射+双下方法
  • 原文地址:https://www.cnblogs.com/flyfish2012/p/3781764.html
Copyright © 2011-2022 走看看