summaryrefslogtreecommitdiffstats
path: root/src/main/scala/myapp/cake
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/myapp/cake')
-rw-r--r--src/main/scala/myapp/cake/container.scala48
-rw-r--r--src/main/scala/myapp/cake/services.scala30
2 files changed, 78 insertions, 0 deletions
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
+}