惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Azure Blog
Microsoft Azure Blog
Cloudbric
Cloudbric
I
InfoQ
V
V2EX
博客园_首页
The Register - Security
The Register - Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
S
Secure Thoughts
Vercel News
Vercel News
Forbes - Security
Forbes - Security
云风的 BLOG
云风的 BLOG
PCI Perspectives
PCI Perspectives
L
LINUX DO - 最新话题
D
DataBreaches.Net
H
Hacker News: Front Page
Application and Cybersecurity Blog
Application and Cybersecurity Blog
B
Blog RSS Feed
A
About on SuperTechFans
N
News and Events Feed by Topic
Apple Machine Learning Research
Apple Machine Learning Research
Help Net Security
Help Net Security
Attack and Defense Labs
Attack and Defense Labs
N
Netflix TechBlog - Medium
Spread Privacy
Spread Privacy
F
Full Disclosure
Recorded Future
Recorded Future
AWS News Blog
AWS News Blog
博客园 - 【当耐特】
The Cloudflare Blog
T
Threatpost
T
Tor Project blog
Google DeepMind News
Google DeepMind News
C
CXSECURITY Database RSS Feed - CXSecurity.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
M
MIT News - Artificial intelligence
A
Arctic Wolf
C
Check Point Blog
Stack Overflow Blog
Stack Overflow Blog
T
Threat Research - Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
Hacker News - Newest:
Hacker News - Newest: "LLM"
WordPress大学
WordPress大学
Cyberwarzone
Cyberwarzone
小众软件
小众软件
C
Cyber Attacks, Cyber Crime and Cyber Security
P
Proofpoint News Feed
Security Latest
Security Latest
The Last Watchdog
The Last Watchdog

博客园 - Apolloge

Ext中的get、getDom、getCmp、getBody、getDoc的区别【转】 Extjs 模板的自定义格式化[转] IT项目开发的75条管理守则【转】 当 eval 返回的 json 值时,提示 Error: Invalid Label 的原因 介绍一个学习方面的网站 Internet Explorer的hasLayout属性 比较常用集合类如何选择 NET常用Request获取信息 UX、UI、UCD、Usability、IA等设计中的常见名词 IE, FireFox, Opera 浏览器支持CSS实现Alpha半透明的方法 中国古代四大神兽图释 软件版本号 中华流传十大吉祥图解 WEB2.0概念诠释 Javascript在页面加载时的执行顺序 URL格式规范 C#.NET 中的类型转换 为什么要进行Code Review? Transact SQL小手册
说说C#下的动态可配置的扩展
Apolloge · 2009-05-22 · via 博客园 - Apolloge

前几天给一个系统做了一个小模块,类似于一个tab组件,和主程序关系不大。但是tab的page页需要根据实际情况进行扩展,同时每个page页的表现都不一样(根据具体需求变动),并且希望这个扩展可以通过外部配置文件配置(类似于Plusin)。

开始没有什么头绪,后来想到扩展的部分可以通过继承的方式实现,在基类中定义输出表现的虚函数,然后在扩展的子类中实现该虚方法,实现自己的表现。通过这种“多态”,实现了扩展的要求。对于新的扩展机能,只需要从该基类继承,实现相应的虚方法,就达到了扩展的目的,而且一点也不影响既存的技能。

对于可配置方面,想通过反射的机制来实现,将扩展的类名声明到配置文件中,使用C#的反射机制,加载具体的子类,以实现可配置的要求。

下面用代码简单的说明一下:

基类的定义:       

    public class Container 
    {
        
private string ContainerNameField;
        
private string DataField;
        
private int IndexField;

        [Serialize(

true)]
        
public string ContainerName
        {
            
get
            {
                
return this.ContainerNameField;
            }
            
set
            {
                
this.ContainerNameField = value;
            }
        }
      
        [Serialize(
true)]
        
public string Data
        {
            
get
            {
                
return this.DataField;
            }
            
set
            {
                
this.DataField = value;
            }
        }

        [Serialize(

true)]
        
public int Index
        {
            
get
            {
                
return this.IndexField;
            }
            
set
            {
                
this.IndexField = value;
            }
        }
    
        
//需要实现的虚函数,默认直接返回数据,不做任何处理
        public virtual string ToHtml()
        {
            
return this.Dtat;
        }
    }

实现扩展子类:

①表现内存数

    public class MemorySizeContainer  : Container 
    {
        
public override string ToHtml()
        {
            
string result = "";
            
int size = int.Parse(base.Data);if (size == 0)
            {
                result 
= "当前内存的为1GB以下";
            }
            
else if (size > 1)
            {
                result 
= string.Format("当前内存的为{0}~{1}GB", size, size + 1);
            }
            
return result;
        }

     }

②表现硬件状态

    public class HardwareStatusContainer : Container
    {
        
public override string ToHtml()
        {
            HardwareStatus status 
= Utility.ToEnum(HardwareStatus, base.Data);
            
switch (status)
            {
                
case HardwareStatus.Ready:
                    
return "正常";

                case HardwareStatus.Faulted:    

                    return "故障";

                case HardwareStatus.Degraded:
                    
return "部分故障";
                
case HardwareStatus.Unknown:
                    
return "未知";
                
default:
                    
return "未知";
            }
        }
    }

...... 

配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration><!--Containers-->
    
<Containers>
      
<!--HardwareStatus-->
      
<Container>
        
<Type>HardwareStatus</Type>

        <ContainerName>硬件状态</ContainerName>
        <Index>0</Index> 
       <Class>Serialize.TabContainer.HardwareStatusContainer</Class>

      </Container><!--Memory-->
      
<Container>
        
<Type>Memory</Type>

        <ContainerName>内存</ContainerName>
        <Index>1</Index>
        <Class>Serialize.TabContainer.MemorySizeContainer </Class>
      </Container>

    </Containers>  
</Configuration>

反射加载:

    public Container ContainerFactory(string pageType, string data)
    {
        
string section = "/Configuration/Containers/Container";
        
string condition = "[Type='" + pageType + "']";
        
string ContainerName = GetValueByCondition(section, "ContainerName", condition);
        
string Class = GetValueByCondition(section, "Class", condition);
        
string index = GetValueByCondition(section, "Index", condition);if ( !string.IsNullOrEmpty(ContainerName) &&
             
!string.IsNullOrEmpty(Class) &&
             
!string.IsNullOrEmpty(index) )
        {
            Type type 
= Type.GetType(Class);
            Container container 
= (Container )Activator.CreateInstance(type, true);
            container.ContainerName 
= ContainerName;
            container.Index 
= index;
            container.Data 
= data;return container;
        }
        
else
        {
            
return null;
        }
    }
private string GetValueByCondition(string section, string key,string condition)
    {
        
try
        {
            String xPathString 
= "/" + section + condition + "/" + key;
            XPathNavigator navigator 
= this.document.CreateNavigator();
            XPathNodeIterator nodeIter 
= ( XPathNodeIterator )navigator.Evaluate(xPathString);if ((nodeIter.Count == 1&& (nodeIter.MoveNext()))
            {
                
return nodeIter.Current.Value;
            }
            
else
            {
                
return null;
            }
        }
        
catch (Exception exception)
        {
            logger.Error(exception.Message, exception);
            
return null;
        }
    }

调用时:


//取得需要tab化的元数据Dictionary <类型,要表现的数据>
Dictionary<stringstring> containerList = GetInfor();
List
<Container> pages = new List<Container>();foreach(string key in containerList )
{
     Container container 
= ContainerFactory(key, containerList[key]);
     
if(!pages.Contains(container))
     {
         pages.add(container); 
     } 
}