play2/slick2 プロジェクトの抽象的な CRUD-DAO に取り組んでいます。便利なタイプ セーフなプライマリ ID を持つために、スリック&の上に追加の抽象化と利便性として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
fromを提供することができT
、自分の Abstract 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に提出されます
編集:
実際には、エラークラスタイプが必要TableQuery[T].baseTableRow.tableName, TableQuery[T]
であるために機能しませんが、Tが見つかりました。IDEAは表面的には問題ありませんでしたが、scalacはそうではありませんでした。