Я работаю над абстрактным CRUD-DAO для своего проекта play2/slick2. Чтобы иметь удобные первичные идентификаторы типа безопасного типа, я использую Unicorn как дополнительную абстракцию и удобство поверх сликов MappedTo
и ColumnBaseType
.
Unicorn предоставляет базовый класс CRUD-DAO BaseIdRepository
, который я хочу расширить для конкретных проектов. Подпись класса
class BaseIdRepository[I <: BaseId, A <: WithId[I], T <: IdTable[I, A]]
(tableName: String, val query: TableQuery[T])
(implicit val mapping: BaseColumnType[I])
extends BaseIdQueries[I, A, T]
Это приводит к реализации DAO, которые выглядят примерно как
class UserDao extends
BaseIdRepository[UserId, User, Users]("USERS", TableQuery[Users])
Это кажется ужасно лишним для меня. Я смог предоставить tableName
и query
из T
, предоставив мне следующую подпись на моем собственном Аннотация DAO
abstract class AbstractIdDao[I <: BaseId, A <: WithId[I], T <: IdTable[I, A]]
extends BaseIdRepository[I,A,T](TableQuery[T].baseTableRow.tableName, TableQuery[T])
Можно ли в Scala каким-то образом вывести типы I
и A
, чтобы сделать подпись такой, как это возможно? (Users
- класс, расширяющийся IdTable
)
class UserDao extends AbstractIdDao[Users]
Возможно ли это без отражения во время выполнения? Если только из-за отражения времени выполнения: как я могу использовать манифест в определении класса и насколько большой эффект влияет на реактивное приложение?
Кроме того, поскольку я довольно новичок в языке и сам работаю: это хорошая практика в Scala вообще?
Спасибо за помощь. Не стесняйтесь критиковать мой вопрос и английский. Разумеется, улучшения будут представлены в Unicorn git -repo
EDIT:
Фактически, TableQuery[T].baseTableRow.tableName, TableQuery[T]
не работает из-за требуемого типа класса ошибки, но T найден, IDEA был поверхностно тонким с ним, scalac не был.