2009-03-31 2 views
4

При выдаче пользовательских исключений или выдачи сообщений конечному пользователю можно использовать жестко закодированные строки (включая строковые константы), использовать сборки только для ресурсов или получать строки из таблицы в базе данных.Лучшая практика. Каков наилучший способ хранения исключений/ошибок или информационных сообщений в C# .net для интернационализации?

Я бы хотел, чтобы мое приложение могло легко переключаться на другой язык без перекомпиляции. Хотя сохранение строковых ресурсов в сборке или базе данных позволило бы достичь этой цели, это добавляет сложности программной логики, которая, в свою очередь, увеличивает стоимость продукта.

Мой вопрос: какой лучший способ пойти с целью в виду, не игнорируя затраты, связанные с каждым вариантом? Если у вас есть практика, которая лучше, чем указано в списке, я бы хотел ее услышать.

технологии: ОС: семейство Windows, Платформа: .NET Рама 2 и до Язык: C# База данных: MS SQL 2005 и выше

Спасибо, ребята!

Cullen

ответ

4

Использование ресурсов:

Как это добавить больше сложности к логике программы?

try 
{ 
    //do something with System.Net.Mail with invalid email.. 
} 
catch (FormatException fex) 
{ 
    throw new Exception(Resources.ErrorMsg.Invalid_Email, fex); 
} 

Редактировать

В VS2008 при создании ресурса, вы можете определить, если его внутренняя или общественности. Поэтому предположим, мы устанавливаем его в общественных местах, в сборке под названием ClassLibrary1, мы можем получить доступ к свойству, как:

ClassLibrary1.Properties.Resources.InvalidError

Где InvalidError это имя ошибки. Опять же, я не думаю, что это добавляет некоторую сложность в логику.

+0

Мое решение содержит несколько проектов, поэтому несколько сборок. Одна из идей - создать сборку ресурсов для хранения строк, а затем использовать ResourceManager для подключения к сборке и чтения строк. Это добавляет сложности. –

+0

@Cullen Tsering: Я должен согласиться с Джошем, дизайнер позаботится обо всем этом для вас и создаст красиво типизированный класс, который предоставляет строки в файле ресурсов, так что все, что вам нужно сделать, это получить доступ к нему, как в его образец. Ваш комментарий указывает, что вы не пробовали поддержку времени разработки. – casperOne

+0

casperOne: Можете ли вы подробно рассказать о поддержке дизайна? –

2

.NET уже поддерживает несколько ресурсов для различных культур с использованием именования:

<default resource file name>.<culture>.resx 

По существу, как Джош отметил 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 спараметрировать выход.

Одно из предостережений - попытаться архитектовать свои уровни приложений таким образом, чтобы ваши исключения несли богатую полезную нагрузку (чтобы описать ошибку) вместо того, чтобы полагаться только на текст.

Таким образом, ваш уровень презентации может обеспечить лучший опыт пользовательского интерфейса, который может использовать полезную нагрузку.

НТН

Филипп

+0

Спасибо Филиппу за полезный комментарий. –