次のようにします。
trait Mytrait { this: DbConnectionFactory => // Require this trait to be mixed with a DbConnectionFactory
def saveData : Boolean = {
val connection = getConnection // Supplied by DbConnectionFactory 'layer'
//use DB connection to make database calls to store
true
}
def getData : Integer = {
val connection = getConnection // Supplied by DbConnectionFactory 'layer'
val i: Integer = ... // use DB connection to get data from database
return i
}
}
trait DbConnection
trait DbConnectionFactory {
def getConnection: DbConnection
}
// --- for prod:
class ProdDbConnection extends DbConnectionFactory {
// Set up conn to prod Db - say, an Oracle DB instance
def getConnection: DbConnection = ???
} // or interpose a connection pooling implementation over a set of these, or whatever
val myProdDbWorker = new ProdDbConnection with Mytrait
// --- for test:
class MockDbConnection extends DbConnectionFactory {
// Set up mock conn
def getConnection: DbConnection = ???
}
val myTestDbWorker = new MockDbConnection with Mytrait
適切な DbConnectionFactory と特性から「レイヤー」または「ケーキ」を形成する場所。
これは単純な例にすぎません。関連するコンポーネントの数を拡張したり、さまざまな状況で使用したい MyTrait の複数の実装を作成したりできます。たとえば、Scala での依存性注入: Cake パターンの拡張を参照してください。