Я читаю Functional And Reactive Domain Modeling от Debasish Ghosh, и я хочу реорганизовать приложение CRUD, которое оно действительно на производстве. Я сосредотачиваюсь на первом подходе с модой Reader для DI, шаблоном репозитория и ADT для приложения, которое управляет значениями эквивалентности между приложениями (думайте о значении, которое определенным образом понимается некоторым приложением, а затем запрашивает его эквивалентное значение для другого система).Как реализовать шаблон Multi-DB с помощью Slick 3.1 и DDD
Дебашиш относится к шаблону репозитория как способ развязки, поэтому в моем случае мне нужны конкретные реализации для Oracle и Postgresql и H2 для тестирования. У меня есть следующий и очень простой реализации (на основе книги):
базы trait
для хранилищ:
trait Repository[A, Id] {
def query(id: Id): Try[Option[A]]
def insert(a: A): Try[A]
def update(a: A): Try[A]
def delete(a: A): Try[A]
}
модуль для эквивалентности Repository:
trait EquivalenceRepository extends Repository[Equivalence, Long]{
def query(id: Long): Try[Option[Equivalence]]
def insert(a: Equivalence): Try[Equivalence]
def update(a: Equivalence): Try[Equivalence]
def delete(a: Equivalence): Try[Equivalence]
}
И среднебетонный бетон impl ementation с Slick:
class EquivalenceOracleRepository extends EquivalenceRepository {
def query(id: Long): Try[Option[Equivalence]] = {
???
}
def insert(a: Equivalence): Try[Equivalence] = {
???
}
def update(a: Equivalence): Try[Equivalence] = {
???
}
def delete(a: Equivalence): Try[Equivalence] = {
???
}
}
private[repository] trait EquivalenceOracleDB{
this: DBComponent =>
import jdbcProfile.api._
final case class EquivalenceDTO(
originId: Int,
equivalenceId: Int,
creator: String,
creationDate: Timestamp,
isActive: Boolean
)
final class EquivalenceTable(tag: Tag) extends Table[Equivalence](tag, "Equivalence"){
def originId: Rep[Int] = column[Int]("ORIGIN_ID", O.SqlType("NUMBER(10)"))
def equivalenceId: Rep[Int] = column[Int]("EQUIVALENCE_ID", O.SqlType("NUMBER(10)"))
def creator: Rep[String] = column[String]("CREATOR", O.SqlType("NUMBER(10)"))
def creationDate: Rep[Timestamp] = column[Timestamp]("CREATION_DATE", O.SqlType("TIMESTAMP(6)"))
def isActive: Rep[Boolean] = column[Boolean]("IS_ACTIVE", O.SqlType("VARCHAR2(1)"))
def pk: PrimaryKey = primaryKey("EQUIVALENCES_PK", (originId, equivalenceId))
def * : ProvenShape[EquivalenceDTO] =
(originId, equivalenceId, creator, creationDate, isActive) <> (EquivalenceDTO.tupled, EquivalenceDTO.unapply)
}
val table = TableQuery[EquivalenceTable]
}
быть последним конкретной реализацией для Oracle, вы можете увидеть, что черта ожидает DBComponent. Это черта, код которого он унаследовал от фактического применения производства и пытается определить конкретный Slick профилей для каждого DBMS:
Это профилирование для каждой СУБД:
trait Profile {
val jdbcProfile: JdbcProfile
}
object OracleProfile extends Profile {
override val jdbcProfile: JdbcProfile = OracleDriver
}
object H2Profile extends Profile {
override val jdbcProfile: JdbcProfile = H2Driver
}
object PostgreSQLProfile extends Profile {
override val jdbcProfile: JdbcProfile = PostgreSQLProfile.jdbcProfile
}
И это определение базы данных:
trait DBComponent {
val jdbcProfile: JdbcProfile
import jdbcProfile.api._
val db: Database
}
trait OracleDB extends DBComponent {
val logger: Logger = LoggerFactory.getLogger(this.getClass)
val jdbcProfile: JdbcProfile = OracleProfile.jdbcProfile
}
trait H2DB extends DBComponent {
val logger: Logger = LoggerFactory.getLogger(this.getClass)
val jdbcProfile: JdbcProfile = H2Profile.jdbcProfile
}
trait PostgreSQLDB extends DBComponent {
val logger: Logger = LoggerFactory.getLogger(this.getClass)
val jdbcProfile: JdbcProfile = PostgreSQLProfile.jdbcProfile
}
Но мои сомнения пришли сюда: если я пытаюсь подмешать EquivalenceOracleDB
черта, которая содержит пятно основы я Nto EquivalenceOracleRepository
также мне нужно подмешать компонент и на самом деле я получаю сообщение об ошибке:
подмешать:
class EquivalenceOracleRepository extends EquivalenceRepository with EquivalenceOracleDB{
и ошибка: Illegal inheritance, self-type EquivalenceOracleRepository does not conform to DBComponent
из-за несоответствия интерфейсов. Таким образом, мне нужно немного света:
- Есть ли известный бетон Slick реализация нескольких децибел, что я могу использовать в сочетании с парадигмой выставленного Debasish?
- Как я мог бы улучшить дизайн моей конкретной реализации для несоблюдения шаблона хранилища, определенного в книге, а также не баловаться бетоном и абстрактная реализации как сейчас?(Сохраняя проблемы разделены)
Я видел the Multi-DB example that Lightbend has, но, кроме проблем, нерешенных зависимостей она в значительной мере опирается на торт шаблон, который очень многословен. Я пытаюсь придерживаться книги.
Любая помощь будет оценена по достоинству.
Благодаря
Это было! также, я должен сказать, что я спросил Debasish на twitter (https://twitter.com/AlejandroM_E/status/803003856124870656), и он обратился к вопросу с несколькими db с помощью этого полезного сообщения: http: //leaks.wanari. ком/2016/08/17/окружающей среды-зависимые базы данные шоферы-скользкий /. –