Хорошо, это решение, которое я выбрал (не самое лучшее решение, я уверен, но достаточно гибкое для моих нужд):
Так как все результаты операций в моем слое businees представлены в любом случае перечислениями (например, EmployeeAddition.SameNameExists
или DepartmentDeletion.DepartmentNotEmpty
), было довольно просто создать класс сущности, который описывает текстовые сообщения, связанные с этими перечислениями:
public class ConfigurableText : Entity
{
public virtual int TextId { get; private set; }
public virtual TextType TypeOfText { get; set; }
public virtual int EnumValue { get; set; }
public virtual string MainLanguageText { get; set; }
public virtual string SecondaryLanguageText { get; set; }
public virtual string Description { get; set; }
public ConfigurableText()
{
TypeOfText = ConfigurableText.TextType.PassengerMessage;
EnumValue = 0;
Description = string.Empty;
TextId = GetTextId(TypeOfText, EnumValue);
}
public ConfigurableText(TextType type, int enumValue,string mainLanguageText,string description) : this()
{
TypeOfText = type;
EnumValue = enumValue;
MainLanguageText = mainLanguageText;
Description = description;
TextId = GetTextId(TypeOfText, EnumValue);
}
public ConfigurableText(TextType type, int enumValue,string mainLanguageText, string description, string secondaryLanguageText) : this(type,enumValue,mainLanguageText,description)
{
SecondaryLanguageText = secondaryLanguageText;
}
public enum TextType
{
EmployeeMessage = 1,
DepartmentDeletionMessage,
//...
}
public static int GetTextId(TextType type, int enumValue)
{
return int.Parse(((int)type).ToString() + "00"
+ enumValue.ToString() + "00");
}
}
и затем клиентское приложение просто выходит:
var ctrl = new TextsManagementController();
ConfigurableTextPO message = ctrl.GetText(ConfigurableText.TextType.EmployeeMessage, (int)this.Validity);
MessageMainLanguage = message.MainLanguageText;
Поскольку я использую кэш 2-го уровня nHibernate, БД (почти) никогда не срабатывает, поэтому производительность не должна быть проблемой.
Конечно, нет проблем создать графический интерфейс для обновления этих объектов.
Недостатком этого является то, что для каждого бита текста, который я хотел бы иметь возможность конфигурировать, я должен определить enum и вручную извлекать значения, когда они необходимы.