0

Я читаю 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, но, кроме проблем, нерешенных зависимостей она в значительной мере опирается на торт шаблон, который очень многословен. Я пытаюсь придерживаться книги.

Любая помощь будет оценена по достоинству.

Благодаря

ответ

1

Причина, по которой вы получаете такую ​​ошибку, что вы не смешиваясь OracleDB. Вы должны заменить:

class EquivalenceOracleRepository extends EquivalenceRepository with EquivalenceOracleDB 

с

class EquivalenceOracleRepository extends EquivalenceRepository with EquivalenceOracleDB with OracleDB 

Теперь вы получите сообщение об ошибке, что db не определен, поэтому вы должны обеспечить его реализацию где-то (потому что это определяется как абстрактный в DBComponent). Я думаю, что это можно сделать в OracleDB, что сделает эту черту бетонной, а не абстрактной, как сейчас. Я так думаю, что вы будете более или менее совместимы с дизайном, представленным в книге (у вас есть абстрактный интерфейс, описывающий ваш репозиторий, а также несколько реализаций конкретных/производственных).

+0

Это было! также, я должен сказать, что я спросил Debasish на twitter (https://twitter.com/AlejandroM_E/status/803003856124870656), и он обратился к вопросу с несколькими db с помощью этого полезного сообщения: http: //leaks.wanari. ком/2016/08/17/окружающей среды-зависимые базы данные шоферы-скользкий /. –