Многовалютная система
От: Аноним  
Дата: 06.10.10 18:06
Оценка:
Доброго вечера!

Есть у нас система, в БД которой заведено много валют.
Пользователь системы может делать разные финансовые операции, и когда юзер работает, то у него всегда выбрана какая-то валюта в комбобоксе.
При этом есть базовая валюта и все деньги в БД хранятся в базовой валюте.
Проблема в том, что есть много сервисов, которые обращаются к Entity и во всех этих обращениях надо знать, что ЭТО поле мы конвертируем из базовой к выбранной комбобоксе юзера. Аналогично при сохранении.
Какие есть мысли, чтобы свести это в одно место?
Re: Многовалютная система
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 06.10.10 19:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброго вечера!


А>Есть у нас система, в БД которой заведено много валют.

А>Пользователь системы может делать разные финансовые операции, и когда юзер работает, то у него всегда выбрана какая-то валюта в комбобоксе.
А>При этом есть базовая валюта и все деньги в БД хранятся в базовой валюте.
А>Проблема в том, что есть много сервисов, которые обращаются к Entity и во всех этих обращениях надо знать, что ЭТО поле мы конвертируем из базовой к выбранной комбобоксе юзера. Аналогично при сохранении.
А>Какие есть мысли, чтобы свести это в одно место?

Я так понимаю что у пользователя есть конфигурационный параметр, указывающий текущую валюту. Этот параметр отображается в combobox. Можно сделать свой тип Money, в котором хранить деньги в сущностях, в ToString которого требовать эту самую валюту. Аналогично запрашивать в конструкторе валюту, чтобы знать из чего во что конвертировать.
Re[2]: Многовалютная система
От: Аноним  
Дата: 08.10.10 03:40
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, Аноним, Вы писали:


А>>Доброго вечера!


А>>Есть у нас система, в БД которой заведено много валют.

А>>Пользователь системы может делать разные финансовые операции, и когда юзер работает, то у него всегда выбрана какая-то валюта в комбобоксе.
А>>При этом есть базовая валюта и все деньги в БД хранятся в базовой валюте.
А>>Проблема в том, что есть много сервисов, которые обращаются к Entity и во всех этих обращениях надо знать, что ЭТО поле мы конвертируем из базовой к выбранной комбобоксе юзера. Аналогично при сохранении.
А>>Какие есть мысли, чтобы свести это в одно место?

G>Я так понимаю что у пользователя есть конфигурационный параметр, указывающий текущую валюту. Этот параметр отображается в combobox. Можно сделать свой тип Money, в котором хранить деньги в сущностях, в ToString которого требовать эту самую валюту. Аналогично запрашивать в конструкторе валюту, чтобы знать из чего во что конвертировать.


хорошее предложение!
Но вот тут подумали и нашли узкое место: вот сделали мы все поля сущности типа Money. А у сущности может в свою очередь граф из сущностей разных типов с полями типа Money. И получается, что если юзер зашел на страницу под одной валютой и потом перещелкнул на другую, то надо сделать нехилый перерасчет всего графа.
Re[3]: Многовалютная система
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 08.10.10 04:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, gandjustas, Вы писали:


G>>Здравствуйте, Аноним, Вы писали:


А>>>Доброго вечера!


А>>>Есть у нас система, в БД которой заведено много валют.

А>>>Пользователь системы может делать разные финансовые операции, и когда юзер работает, то у него всегда выбрана какая-то валюта в комбобоксе.
А>>>При этом есть базовая валюта и все деньги в БД хранятся в базовой валюте.
А>>>Проблема в том, что есть много сервисов, которые обращаются к Entity и во всех этих обращениях надо знать, что ЭТО поле мы конвертируем из базовой к выбранной комбобоксе юзера. Аналогично при сохранении.
А>>>Какие есть мысли, чтобы свести это в одно место?

G>>Я так понимаю что у пользователя есть конфигурационный параметр, указывающий текущую валюту. Этот параметр отображается в combobox. Можно сделать свой тип Money, в котором хранить деньги в сущностях, в ToString которого требовать эту самую валюту. Аналогично запрашивать в конструкторе валюту, чтобы знать из чего во что конвертировать.


А>хорошее предложение!

А>Но вот тут подумали и нашли узкое место: вот сделали мы все поля сущности типа Money. А у сущности может в свою очередь граф из сущностей разных типов с полями типа Money. И получается, что если юзер зашел на страницу под одной валютой и потом перещелкнул на другую, то надо сделать нехилый перерасчет всего графа.

"Всего графа" это под сотню операция умножения и деления. Не страшно.
Re[4]: Многовалютная система
От: Аноним  
Дата: 08.10.10 04:56
Оценка:
Здравствуйте, gandjustas, Вы писали:

А>>хорошее предложение!

А>>Но вот тут подумали и нашли узкое место: вот сделали мы все поля сущности типа Money. А у сущности может в свою очередь граф из сущностей разных типов с полями типа Money. И получается, что если юзер зашел на страницу под одной валютой и потом перещелкнул на другую, то надо сделать нехилый перерасчет всего графа.

G>"Всего графа" это под сотню операция умножения и деления. Не страшно.


ну если учесть, что тут придется задействовать рефлексию, то страшно.
* — рефлексия нужна для определения свойств типа Money.

Пока решили так есть DTO объекты в которые передается еще и курс + название валюты.
Есть сервис которые формирует DTO из сущностей и у которого есть один конструктор, принимающий сущность — текущую валюту.
Ну а дальше при вызове метода сервиса по конвертированию entity в DTO туда еще передается курс и название валюты
Re[5]: Многовалютная система
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 08.10.10 05:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, gandjustas, Вы писали:


А>>>хорошее предложение!

А>>>Но вот тут подумали и нашли узкое место: вот сделали мы все поля сущности типа Money. А у сущности может в свою очередь граф из сущностей разных типов с полями типа Money. И получается, что если юзер зашел на страницу под одной валютой и потом перещелкнул на другую, то надо сделать нехилый перерасчет всего графа.

G>>"Всего графа" это под сотню операция умножения и деления. Не страшно.


А>ну если учесть, что тут придется задействовать рефлексию, то страшно.

А>* — рефлексия нужна для определения свойств типа Money.
Не, ты видимо не понял.

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

А>Пока решили так есть DTO объекты в которые передается еще и курс + название валюты.

А>Есть сервис которые формирует DTO из сущностей и у которого есть один конструктор, принимающий сущность — текущую валюту.
А>Ну а дальше при вызове метода сервиса по конвертированию entity в DTO туда еще передается курс и название валюты
Есть два варианта реализации многовалютности:
1)Учитывать валюту в бизнес логике
2)Учитывать её только в интерфейсе

Первый сложнее и появляются непонятки как складывать доллары с рублями. Обычно используется в банках, там набор операций ограничен. Второй вариант проще, так как валюта присутствует только в интерфейсе, а логика от нее не зависит. Но во втором варианте отслеживать валютные операции сложно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.