• .Net之美读书笔记13


    .Net应用程序配置

    .Net中的配置文件与读取

    .Net中Config文件有web.config和App.config文件,这里用App.config举例(需要引用程序集:System.Configuration)。

    	<appSettings>
    		<add key="SiteName" value="WWW.baidu.com"/>
    	</appSettings>
    
    	string siteName = ConfigurationManager.AppSettings["SiteName"];
        Console.WriteLine(siteName);
    

    使用内置节点和.Net内置处理程序

    应用配置Appconfig跟节点下

    <configSections>
    		<section name="mailServer" type="System.Configuration.SingleTagSectionHandler,System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </configSections>
    <mailServer address="mail.163.com" userName="LoveTomato" password="123456"></mailServer>
    

    程序读取

    Hashtable mailServer = (Hashtable)ConfigurationManager.GetSection("mailServer");
    string address = mailServer["address"].ToString();
    string userName = mailServer["userName"].ToString();
    string password = mailServer["password"].ToString();
    
    Console.WriteLine("Address:{0},UserName:{1},PassWord:{2}",address,userName,password);
    

    使用自定义节点和自定义处理

    这种功能更灵活强大,自定义处理可以通过实现接口IConfigurationSectionHandler或继承类ConfigurationSection,这里演示实现接口
    新建配置文件

    	<configSections>
    		<section name="mailServerGroup" type="CustomConfig.MailServerConfigurationHandler,CustomConfig"/>
    	</configSections>
    
        <mailServerGroup provider="www.baidu.com">
    		<mailServer client="163">
    			<address>mail.163.com</address>
    			<userName>Jerry</userName>
    			<passWord>123456</passWord>
    		</mailServer>
    
    		<mailServer client="qq">
    			<address>mail.qq.com</address>
    			<userName>Jerry</userName>
    			<passWord>123456</passWord>
    		</mailServer>
    	</mailServerGroup>
    

    新建类库,其下文件MailServer.cs对应 节点对象,MailServerConfig.cs存储节点对象集合,MailServerConfigurationHandler.cs实现接口IConfigurationSectionHandler功能读取配置文件保存到集合。

    public class MailServer
    	{
    		private Hashtable serverNode;
    		public MailServer()
    		{
    			serverNode = new Hashtable();
    		}
    		public Hashtable ServerNode
    		{
    			get
    			{
    				return serverNode;
    			}
    		}
    		public string Client
    		{
    			get
    			{
    				return serverNode["client"] as string;
    			}
    		}
    		public string Address
    		{
    			get
    			{
    				return serverNode["address"] as string;
    			}
    		}
    		public string UserName
    		{
    			get
    			{
    				return serverNode["userName"] as string;
    			}
    		}
    		public string Password
    		{
    			get
    			{
    				return serverNode["passWord"] as string;
    			}
    		}
    	}
    
    	public class MailServerConfig:List<MailServer>
    	{
    		public string Provider { get; set; }
    	}
    
    	public class MailServerConfigurationHandler : IConfigurationSectionHandler
    	{
    		public object Create(object parent, object configContext, XmlNode section)
    		{
    			MailServerConfig config = new MailServerConfig();
    
    			config.Provider = section.Attributes["provider"] == null ? string.Empty : section.Attributes["provider"].Value;
    
    			foreach(XmlNode child in section.ChildNodes)
    			{
    				MailServer server = new MailServer();
    
    				if (child.Attributes["client"] != null)
    					server.ServerNode.Add("client", child.Attributes["client"].Value);
    				foreach(XmlNode grandChild in child.ChildNodes)
    				{
    					server.ServerNode.Add(grandChild.Name, grandChild.InnerText);
    				}
    
    				config.Add(server);
    			}
    
    			return config;
    		}
    	}
    

    主程序中调用

        //该方法会调用MailServerConfigurationHandler类的Create方法,从而实现映射
        MailServerConfig serverGroup = (MailServerConfig)ConfigurationManager.GetSection("mailServerGroup");
        Console.WriteLine("Provider:".PadRight(12) + serverGroup.Provider);
        foreach(MailServer config in serverGroup)
        {
            string str = string.Format("Client:{0},Address:{1},UserName:{2},PassWord:{3}",config.Client,config.Address,config.UserName,config.Password);
            Console.WriteLine(str);
        }
    

    存储实例

    存储实例应用比较广,Ioc依赖倒置也是在其基础上实现。这里简单说下实现思想

    1. 接口化方式编程,定义接口和实现接口的类
    2. 通过配置文件指定采用实现接口的那个类型
    3. 自定义处理返回指定类型的实例
    4. 返回的实例赋值给接口

    总结

    本节讲了.Net中的配置,这里的目的不是自己编写配置,而是便于类型中用到这样配置易于理解(如EntityFrameWork)。如果向自己编写还需进一步研究

  • 相关阅读:
    oracle 例外
    Help with Intervals(集合的交并补,线段树)
    Mex(线段树的巧妙应用)
    hdu4578Transformation(线段树多个lz标记)
    Coder(线段树)
    Ice-cream Tycoon9(线段树)
    Partition(线段树的离线处理)
    ACM学习大纲(转)
    Codeforces Round #250 (Div. 1)
    记次浙大月赛 134
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/8086134.html
Copyright © 2020-2023  润新知