当引发自定义异常或向最终用户发出消息时,可以使用硬编码的字符串(包括字符串常量)、使用仅资源程序集或从数据库的表中获取字符串。
我希望我的应用程序能够轻松地切换到不同的语言,而不必重新编译。虽然将字符串资源存储在程序集或数据库中可以实现此目的,但它增加了程序逻辑的复杂性,进而增加了产品的成本。
我的问题是:在不忽略每个选项带来的成本的情况下,实现目标的最佳方法是什么?如果你有一个比上面列出的更好的实践,我很乐意听听。
技术:操作系统: Windows系列平台:.NET Frame 2及以上语言: C#数据库: MS SQL2005及以上
谢谢你们!
库伦
发布于 2009-03-31 19:03:50
使用资源:
这如何增加程序逻辑的复杂性?
try
{
//do something with System.Net.Mail with invalid email..
}
catch (FormatException fex)
{
throw new Exception(Resources.ErrorMsg.Invalid_Email, fex);
}
编辑
在VS2008中,当您创建资源时,您可以定义它是内部资源还是公共资源。因此,假设我们将其设置为public,在一个名为ClassLibrary1的程序集中,我们可以访问如下属性:
ClassLibrary1.Properties.Resources.InvalidError
其中InvalidError是错误的名称。再说一次,我不认为这会增加逻辑上的必然性。
发布于 2010-01-16 06:48:15
.NET已经支持使用命名约定的多个区域性的多个资源:
<default resource file name>.<culture>.resx
本质上,正如Josh指出的那样,VS2008创建了一个很好的类型安全包装器来访问这些资源。
然而,VS UI公开了您可以做的最小限度的事情。
如果创建的新资源文件与默认值完全相同,请在resx之前添加区域性信息。(注意:您需要在其他地方创建它,然后将其复制到魔术属性文件夹中。)
如果您已将区域性应用于访问资源的线程,则您的应用程序将从特定资源中提取正确的字符串。
例如:
// Using the default culture
string s = Resources.Error1Msg;
Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-CO");
// Using the specific culture specified as above:
s = Resources.Error1Msg;
如果需要参数化消息,可以使用string.Format来参数化输出。
需要注意的一点是,尝试以这样一种方式构建应用程序层,即异常携带丰富的有效负载(用于描述错误),而不是仅仅依赖于文本。
这样,您的表示层可以呈现最佳的UI体验,从而可以利用有效负载。
HTH
菲利普
https://stackoverflow.com/questions/702559
复制相似问题