UML软件工程组织

灵活的.NET体系结构之简化配置服务(2)
 
作者:宁凯编译
 
来源:赛迪网
一旦我们有了这样一个可以使用的API,就不必再创建新的section处理器了。至少这一点对于简单的配置而言是可以实现的。尽管我认为这只是是简化操作的开始,但我还是对能进一步简化配置而感到惊讶。现在,还是让我们先来对此API再进行一次扩充。

您经常会发现一些配置关键字是必选的。请务必牢记这一点,如果一个关键字未找到,AppServices.getValue(...)将会抛出一个异常,而且,客户端可能会指定一个默认值来应对找不到关键字的情况。下面是此API的重载版本,这个版本中将上面所述的情况考虑在内:


string value = AppServices.getValue(
"/SimpleConfiguration/Module1/section1/key1",
"defaultvalue");


API的这个版本在找不到关键字时,不但不会引发异常,相反将会返回已设置的默认值。例如,您可以进行如下操作:


string value =
AppServices.getValue(
"/SimpleConfiguration/Module1/section1/key1", null);
if (value == null)
{
    // you have just avoided an exception if you care to do so
}


通过降低错误率来使关键字不区分大小写也是完全可能的。此方法与Xpath相类似。注意到这一点,下面是该API的又一个版本:


string xpathExpression = ".";
string value = AppServices.getXPathValueString(
xpathExpression);


有时候您可能会遇到一个给定的key对应多个结点。这种情况下,您可能希望收到的结点为XML结点。要实现这一点,可以进行如下操作:


XMLNode node = AppServices.getXPath(xpathExpression);


我们再回到基本的AppServices.getValue(key)方法。有时,虽然这里的key是在XML文件中指定的,但它的内容却可能是空白符号。这种情况下,可将该key视为根本不存在。同样,也可以选择让API抛出一个异常。如果要兼顾到此种变化,可以调用另一函数:


string value = AppServices.getValueHonourWhiteSpace(key);


概括一下,截止目前我们已经得到了下列这些函数:


Public class AppServices
{
    // Configuration Service
    public static getValue(string key);
      // throws an exception if the key is not found or has an 
     // empty string
    public static getValueHonourWhiteSpace(string key)
      // throws an exception if the key is not found
    public static getValue(string key, string default);
      // returns the default if the key is not found or has an 
     // empty string
    public static getValueHonourWhiteSpace(string key,string default)
      // returns the default if the key is not found
    //Xpath support
    public static getXPathValue(string key);
       // throws an exception if the key is not found or has an 
      // empty string
    public static getXPathValueHonourWhiteSpace(string key)
      // throws an exception if the key is not found
    public static getXPathValue(string key, string default);
      // returns the default if the key is not found or has an 
      // empty string
    public static getXPathValueHonourWhiteSpace(string key, string default)
     // returns the default if the key is not found
    // Other future services
}


我们在这里所采取的一切方法就是为了真正实现简化。具体实现时,可根据情况选择实现上述API之中的一部分。

实现配置服务


将配置服务应用到一个实际的示例,我们将会对相关内容有更清晰的理解。在这个示例中,我们将在Web应用程序中发送电子邮件。可能您已经有了如下所示的一个API :


public static void sendMail(string from, string to, string subject, string body, 
string format);


如果使用此 API,则客户端代码将是:


public static trivialMailExample()
    {
      string from="support@johndoeinc.com";
      string to = "johndoe2@customerinc.com";
      string subject = "Your order is ready";
      string body="You can pick it up at facility1";
      string format = "plain-text";
      sendMail(from,to,subject,body,format);
    }


正如您所看到的,很难对电子邮件的所有参数进行编码以便嵌入到Web站点中。如果我们想从配置文件中读取这样的一些参数又会怎么样呢?


...
<SimpleConfiguration>
    <EmailInfo>
      <from>support@johhdoeinc.com
      <subject>Your order is ready. Order number {0}</subject>
      <body> <![[CDATA
<html>
<body>
    <p>Here are your order details</p>
    {0}
</body>
</html>
      ]]>
      </body>
      <format>html</format>
    </EmailInfo>
</SimpleConfiguration>


只要此配置适当,就可以将先前的方法更改为下面所示的方法:


public static trivialMailExampleEnabledForConfig(string toCustomer, string 
orderId)
    {
      string from = AppServices.getValue("/SimpleConfiguration/from"); 
        // an error not to have it
      string subject = 
string.Format(AppServices.getValue("/SimpleConfiguration/from"), orderId);
      string body = 
string.Format(AppServices.getValue("/SimpleConfiguration/from"), orderId);
      string format = 
AppServices.getValue("/SimpleConfiguration/from","plain-text"); 
      // defaults to plain-text
      sendMail(from,toCustomer,subject,body,format);
    }

  

 

版权所有:UML软件工程组织