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注入点,把容器启动

  • 相关阅读:
    样式超出设定宽度显示显示省略号
    客户端存在潜在危险request.from
    MenuStrip如何设置快捷键
    SVN的使用方法
    长串英文字符不换行的解决办法
    thickbox使用
    System.Web.UI.UserControl”,因此此处不允许
    C#中实现拖动无边框Form窗体和窗体的起始位置
    (转)Altera Forum精彩问答汇总
    (转)如何以32 bit的方式存取SDRAM?
  • 原文地址:https://www.cnblogs.com/flyfish2012/p/3781764.html
Copyright © 2011-2022 走看看