Есть у нас система, в БД которой заведено много валют.
Пользователь системы может делать разные финансовые операции, и когда юзер работает, то у него всегда выбрана какая-то валюта в комбобоксе.
При этом есть базовая валюта и все деньги в БД хранятся в базовой валюте.
Проблема в том, что есть много сервисов, которые обращаются к Entity и во всех этих обращениях надо знать, что ЭТО поле мы конвертируем из базовой к выбранной комбобоксе юзера. Аналогично при сохранении.
Какие есть мысли, чтобы свести это в одно место?
Здравствуйте, Аноним, Вы писали:
А>Доброго вечера!
А>Есть у нас система, в БД которой заведено много валют. А>Пользователь системы может делать разные финансовые операции, и когда юзер работает, то у него всегда выбрана какая-то валюта в комбобоксе. А>При этом есть базовая валюта и все деньги в БД хранятся в базовой валюте. А>Проблема в том, что есть много сервисов, которые обращаются к Entity и во всех этих обращениях надо знать, что ЭТО поле мы конвертируем из базовой к выбранной комбобоксе юзера. Аналогично при сохранении. А>Какие есть мысли, чтобы свести это в одно место?
Я так понимаю что у пользователя есть конфигурационный параметр, указывающий текущую валюту. Этот параметр отображается в combobox. Можно сделать свой тип Money, в котором хранить деньги в сущностях, в ToString которого требовать эту самую валюту. Аналогично запрашивать в конструкторе валюту, чтобы знать из чего во что конвертировать.
Re[2]: Многовалютная система
От:
Аноним
Дата:
08.10.10 03:40
Оценка:
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Аноним, Вы писали:
А>>Доброго вечера!
А>>Есть у нас система, в БД которой заведено много валют. А>>Пользователь системы может делать разные финансовые операции, и когда юзер работает, то у него всегда выбрана какая-то валюта в комбобоксе. А>>При этом есть базовая валюта и все деньги в БД хранятся в базовой валюте. А>>Проблема в том, что есть много сервисов, которые обращаются к Entity и во всех этих обращениях надо знать, что ЭТО поле мы конвертируем из базовой к выбранной комбобоксе юзера. Аналогично при сохранении. А>>Какие есть мысли, чтобы свести это в одно место?
G>Я так понимаю что у пользователя есть конфигурационный параметр, указывающий текущую валюту. Этот параметр отображается в combobox. Можно сделать свой тип Money, в котором хранить деньги в сущностях, в ToString которого требовать эту самую валюту. Аналогично запрашивать в конструкторе валюту, чтобы знать из чего во что конвертировать.
хорошее предложение!
Но вот тут подумали и нашли узкое место: вот сделали мы все поля сущности типа Money. А у сущности может в свою очередь граф из сущностей разных типов с полями типа Money. И получается, что если юзер зашел на страницу под одной валютой и потом перещелкнул на другую, то надо сделать нехилый перерасчет всего графа.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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 туда еще передается курс и название валюты
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, gandjustas, Вы писали:
А>>>хорошее предложение! А>>>Но вот тут подумали и нашли узкое место: вот сделали мы все поля сущности типа Money. А у сущности может в свою очередь граф из сущностей разных типов с полями типа Money. И получается, что если юзер зашел на страницу под одной валютой и потом перещелкнул на другую, то надо сделать нехилый перерасчет всего графа.
G>>"Всего графа" это под сотню операция умножения и деления. Не страшно.
А>ну если учесть, что тут придется задействовать рефлексию, то страшно. А>* — рефлексия нужна для определения свойств типа Money.
Не, ты видимо не понял.
В самом типе money ничего не пересчитывает, внутри хранится "инвариантная валюта", пересчитывается при выводе.
Если тебе надо money преобразовать в строку, то эта операция должна требовать указания валюты, которая берется из настроек пользователя.
А>Пока решили так есть DTO объекты в которые передается еще и курс + название валюты. А>Есть сервис которые формирует DTO из сущностей и у которого есть один конструктор, принимающий сущность — текущую валюту. А>Ну а дальше при вызове метода сервиса по конвертированию entity в DTO туда еще передается курс и название валюты
Есть два варианта реализации многовалютности:
1)Учитывать валюту в бизнес логике
2)Учитывать её только в интерфейсе
Первый сложнее и появляются непонятки как складывать доллары с рублями. Обычно используется в банках, там набор операций ограничен. Второй вариант проще, так как валюта присутствует только в интерфейсе, а логика от нее не зависит. Но во втором варианте отслеживать валютные операции сложно.