最佳实践:在C#.net中存储异常/错误或信息性消息以进行国际化的最佳方法是什么?

时间:2009-03-31 18:59:13

标签: c# .net database resources

当向最终用户抛出自定义异常或发出消息时,可以使用硬编码字符串(包括字符串常量),使用仅资源程序集或从数据库中的表中获取字符串。

我希望我的应用程序能够轻松切换到另一种语言,而无需重新编译。将字符串资源存储在程序集或数据库中会实现此目的,但会增加程序逻辑的复杂性,从而增加产品的成本。

我的问题是:在不忽略每个选项带来的成本的情况下,考虑目标的最佳方法是什么?如果你的练习比列出的更好,我很乐意听到它。

技术: 操作系统:Windows系列 平台:.NET Frame 2及更高版本 语言:C# 数据库:MS SQL 2005及以上

谢谢你们!

库伦

2 个答案:

答案 0 :(得分:4)

使用资源:

这如何增加程序逻辑的复杂性?

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是错误的名称。我再次认为这不会给逻辑增加任何强制性。

答案 1 :(得分:2)

.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

菲利普