나는 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을 보았다
(유지 우려 구분)하지만. 나는 그 책을 고집하려고 노력하고있어.
도움이 될 것입니다.
감사
그게 전부 였어! 또한 나는 트위터 (https://twitter.com/AlejandroM_E/status/803003856124870656)에서 Debasish에게 물어 봤다고 말하면서이 유용한 게시물 인 multi-db 질문에 답변했습니다 : http : //leaks.wanari. co.kr/2016/08/17/enviroment-dependent-database-drivers-slick /. –