0

나는 Debasish Ghosh가 Functional And Reactive Domain Modeling을 읽고 있는데 실제로 CRUD 응용 프로그램을 리팩터링하려고합니다. DI, Repository 패턴에 대한 Reader 모나드와 응용 프로그램 간의 동일 값을 관리하는 응용 프로그램에 대한 ADT (첫 번째 접근법에 초점을 맞추고 있습니다. 특정 응용 프로그램에서 특정 방식으로 이해 한 값을 생각한 다음 다른 값과 동일한 값을 쿼리합니다. 체계).Slick 3.1 및 DDD를 사용하여 다중 DB 패턴을 구현하는 방법

Debasish는 디커플링을위한 방법으로 저장소 패턴을 참조하므로, 제 경우에는 테스트를 위해 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] 

} 

모듈 :

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 : 마지막 하나를 오라클에 대한 구체적인 구현 인

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] 

} 

, 당신은 특성이 DBComponent을 기대하고 있음을 볼 수 있습니다.

이것은 모든 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 
} 

그리고 이것이이 누구의 코드는 실제 생산 응용 프로그램에서 상속하려고 할 것 모든 DBMS에 대한 구체적인 슬릭 프로파일을 정의하는 특성입니다 데이터베이스 정의 :

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을하기 때문에 인터페이스의 불일치.

  • 내가 Debasish에 의해 노출 패러다임과 함께 사용할 수있는 알려진 콘크리트 슬릭 멀티 DB 구현이 있습니까 : 그래서, 나는 약간의 빛이 필요하십니까?
  • 가 어떻게 지금과 같은 구체적이고 추상적 인 구현을 엉망으로하지 또한이 책에서 정의 된 저장소 패턴을 준수하고있는 내 구체적인 구현의 디자인을 향상시킬 수
  • ?떨어져 미해결 의존성 문제의 매우 자세한입니다 케이크 패턴에 크게 의존하고, 내가 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에서 할 수 있다고 생각한다. 그것은 그 특성을 콘크리트처럼 만들고 추상적이 아닌 지금 만들 것이다. 나는 당신이 책에서 제시된 디자인 (당신은 당신의 Repository와 여러 concrete/production 구현체를 기술하는 추상 인터페이스를 가짐)을 어느 정도 준수 할 것이라고 생각한다.

+0

그게 전부 였어! 또한 나는 트위터 (https://twitter.com/AlejandroM_E/status/803003856124870656)에서 Debasish에게 물어 봤다고 말하면서이 유용한 게시물 인 multi-db 질문에 답변했습니다 : http : //leaks.wanari. co.kr/2016/08/17/enviroment-dependent-database-drivers-slick /. –

관련 문제