2013-08-27 4 views
2

У меня есть случай класса с большим количеством полей, таких как:Update случай класса с другим одним

case class Person(id: Long, name: String, login: String, passwordHash: String, ...) 

Также у меня есть веб-страницу (воспроизведение), чтобы изменить некоторые поля Person. Эта страница работает с другим случаем классом, который содержит подмножество Person полеев отображается на странице:

case class PersonProjection(id: Long, name: String) 

Существует много таких проекции и некоторые поля (как id) может быть использованы во многих проекциях

Могли вы можете предложить, как я могу построить PersonProjection от Person и обновить существующий Person экземпляр с PersonProjection?

Несомненно, я реализую эти преобразования самостоятельно, но, возможно, есть какая-то передовая практика для этой ситуации? Некоторая библиотека или шаблон? Подходят ли линзы?

Спасибо!

ответ

0

Одним из вариантов было бы определить Person в терминах PersonProjection:

case class Person(proj: PersonProjection, passwordHash: String ...) 

Тогда либо получить доступ к идентификатор, как person.proj.id и т.д., или же добавить вспомогательные методы для Person, чтобы получить доступ к этим более удобно:

case class Person(proj: PersonProjection, passwordHash: String) { 
    val id = proj.id 
    val name = proj.name 
} 

Обновление от проекции так же просто, как вызов копии на примере Person:

val updated = person.copy(proj = projFromForm) 
+0

Это не будет работать, потому что у меня есть проекции человека с пересекающимися свойствами. У меня есть вопрос: – 1esha

+0

@ 1esha Хм, вы могли бы попробовать выбрать наиболее подходящие проекции, чтобы использовать для создания Человека, и жить с некоторыми шаблонами для других. – Shadowlands

+0

это именно то, что вы не хотите делать :) в любом случае спасибо за идею – 1esha

0

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

Если что-то может вам помочь, оно будет безжизненным с его изоморфизмами.

+0

Да, я планирую получить полное «Лицо» по id и применить изменения от «PersonProjection» – 1esha

Смежные вопросы