Пост Ayendes - отличное начало того, как он должен быть оформлен.
Отлично подойдет для корпоративных решений. Имена в отдельной таблице похожи на любой другой список значений. Особенность в том, что он фильтруется в отображении.
Редактировать - Опции:
Использование другого объекта для редактирования данных
Существует сущность Product, в которой все имена представлены в виде списка. LocalizedProduct имеет только название текущего языка.
Получить отфильтрованный объект
- либо сопоставив его, как описано в блоге, с фильтром.
- , выбрав его с помощью преобразователя результатов (Transformers.AliasToBean) или с помощью «выбрать новый LocalizedProduct (id, name, приз ...)». LocalizedProduct не будет отображаться в этом случае. Должен быть ориентирован на кэш второго уровня.
Если у вас много ссылок на Product, вероятно, не очень хорошо иметь два класса, потому что вы не знаете, какой класс должен иметь ссылка.
Использовать один и тот же объект для редактирования и отображения
class Product
{
string LocalizedName
{
get { return AllProductNames[Thread.CurrentThread.CurrentCulture.LCID]; }
}
IDictionary<int, string> AllProductNames { get; private set; }
}
Существуют свойства для локализованного названия продукта (get) и для всех названий продуктов.
- не фильтруйте их вообще :-) Существует небольшая нагрузка на сеть. если у вас есть только от 3 до 5 языков, это не так уж плохо. если у вас есть 20 или больше, вероятно, лучше отфильтровать имена.
- используйте (необязательный) фильтр, как описано в блоге, но в названиях продуктов
- использовать (необязательный) ResultTransformer (CriteriaUtil.AliasToEntityMap) для фильтрации имен.
Если честно, я бы выбрал вариант, который не требует фильтров в файлах сопоставления. Фильтры относятся к запросам, где их удобнее обслуживать.