diff options
Diffstat (limited to 'src/main/scala/myapp')
-rw-r--r-- | src/main/scala/myapp/application.scala | 13 | ||||
-rw-r--r-- | src/main/scala/myapp/cake/container.scala | 48 | ||||
-rw-r--r-- | src/main/scala/myapp/cake/services.scala | 30 | ||||
-rw-r--r-- | src/main/scala/myapp/database.scala | 19 | ||||
-rw-r--r-- | src/main/scala/myapp/logger.scala | 10 |
5 files changed, 120 insertions, 0 deletions
diff --git a/src/main/scala/myapp/application.scala b/src/main/scala/myapp/application.scala new file mode 100644 index 0000000..24cda2a --- /dev/null +++ b/src/main/scala/myapp/application.scala @@ -0,0 +1,13 @@ +package myapp.application + +import myapp.logger.Logger +import myapp.database.Database + +class MyApp (logger: Logger, dbh: Database) { + def run { + logger.log("starting") + logger.log("got a dbh: " + dbh) + logger.log(dbh.query("foo")) + logger.log("ending") + } +} diff --git a/src/main/scala/myapp/cake/container.scala b/src/main/scala/myapp/cake/container.scala new file mode 100644 index 0000000..7c40880 --- /dev/null +++ b/src/main/scala/myapp/cake/container.scala @@ -0,0 +1,48 @@ +package myapp.cake.container + +import myapp.cake.services +import myapp.logger.FileLogger +import myapp.database.DBI +import myapp.application.MyApp + +trait HasLogger extends services.HasLogger { + type LoggerType = Logger + + class Logger( + logFileName: String + ) extends FileLogger(logFileName) with LoggerService +} + +trait HasDatabase extends services.HasDatabase { + type DatabaseType = Database + + class Database protected ( + dsn: String, + username: String, + password: String + ) extends DBI(dsn, username, password) with DatabaseService + + object Database { + def connect(dsn: String, username: String, password: String) = + new Database(dsn, username, password) + } +} + +trait HasApplication extends services.HasApplication { + this: HasLogger with HasDatabase => + + type ApplicationType = Application + + class Application extends MyApp(logger, database) with ApplicationService +} + +class Container ( + logFileName: String = "out.log", + dsn: String = "dbi:mysql:myapp", + username: String = "doy", + password: String = "blah" +) extends HasApplication with HasLogger with HasDatabase { + lazy val application = new Application + lazy val logger = new Logger(logFileName) + lazy val database = Database.connect(dsn, username, password) +} diff --git a/src/main/scala/myapp/cake/services.scala b/src/main/scala/myapp/cake/services.scala new file mode 100644 index 0000000..99be3d5 --- /dev/null +++ b/src/main/scala/myapp/cake/services.scala @@ -0,0 +1,30 @@ +package myapp.cake.services + +import myapp.database.Database +import myapp.logger.Logger + +trait HasApplication { + type ApplicationType + + val application: ApplicationType with ApplicationService + + trait ApplicationService { + def run (): Unit + } +} + +trait HasDatabase { + type DatabaseType + + val database: DatabaseType with DatabaseService + + trait DatabaseService extends Database +} + +trait HasLogger { + type LoggerType + + val logger: LoggerType with LoggerService + + trait LoggerService extends Logger +} diff --git a/src/main/scala/myapp/database.scala b/src/main/scala/myapp/database.scala new file mode 100644 index 0000000..9a321c2 --- /dev/null +++ b/src/main/scala/myapp/database.scala @@ -0,0 +1,19 @@ +package myapp.database + +trait Database { + def query (search: String): String +} + +class DBI protected ( + dsn: String, + username: String, + password: String +) extends Database { + def query (search: String): String = "found " + search + override def toString = List(dsn, username, password).mkString(", ") +} + +object DBI { + def connect (dsn: String, username: String, password: String) = + new DBI(dsn, username, password) +} diff --git a/src/main/scala/myapp/logger.scala b/src/main/scala/myapp/logger.scala new file mode 100644 index 0000000..8e985dc --- /dev/null +++ b/src/main/scala/myapp/logger.scala @@ -0,0 +1,10 @@ +package myapp.logger + +trait Logger { + def log (msg: String): Unit +} + +class FileLogger (logFileName: String) extends Logger { + def log (msg: String): Unit = + println("writing " + msg + " to " + logFileName) +} |