diff options
Diffstat (limited to 'src/main/scala/myapp/cake')
-rw-r--r-- | src/main/scala/myapp/cake/container.scala | 48 | ||||
-rw-r--r-- | src/main/scala/myapp/cake/services.scala | 30 |
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 +} |