Skip to content

Instantly share code, notes, and snippets.

@privateblue
privateblue / kinja-core-di.scala
Last active December 18, 2015 02:18
dependency injection pattern for factories and services
trait Driver
trait TestDriver
class PostFactory {
def hello = "post"
}
class BlogFactory {
def hello = "blog"
@privateblue
privateblue / kinja-core-di-2.scala
Last active December 18, 2015 15:49
cake pattern based dependency injection pattern for repositories and services
// a dependency
trait Driver {
val message: String
}
trait ProductionDriver extends Driver {
val message = "production "
}
@privateblue
privateblue / traits vs pattern matching vs type class
Created August 15, 2013 21:54
three solutions for the same problem: traits, pattern matching, type class
// our model
object model {
abstract class X
case class A extends X
case class B extends X
}
import akka.actor.{ ActorSystem, Actor, Props }
class HelloWorld {
def foobar = println(Thread.currentThread().getName())
}
object Test {
class TestActor(hw: HelloWorld) extends Actor {
def receive = {
@privateblue
privateblue / kinja-core-di-3.scala
Last active December 28, 2015 18:39
mixed style dependency injection pattern for repositories and services
// COMMON-BASE LIBRARY
// dependencies
trait ConnectionPoolProvider {
protected val connectionPool: ConnectionPool
}
trait ExternalStuff {
protected val stuff = "stuff"
import org.pblue.asyncpools.slick.SlickPoolFactory
object MySlickPools extends SlickPoolFactory {
val myReadPool = newConfiguredSlickPool("my-read-pool")
val myWritePool = newConfiguredSlickPool("my-write-pool")
}
import scala.slick.driver.H2Driver.simple._
object MyRepository {
val table = new Table[(Int, String)]("my_table") {
def id = column[Int]("id", O.PrimaryKey)
def name = column[String]("name")
def * = id ~ name
}
import play.api.mvc._
import play.api.libs.json.Json
import play.api.libs.concurrent.Execution.Implicits.defaultContext
object MyController extends Controller {
def getName(id: Int) = Action.async {
MyRepository.getName(id)
.map { name: String =>
Ok(Json.obj("name" -> name))
asyncpools {
my-read-pool {
size = 5
defaultTimeout = "2 seconds"
url = "jdbc:h2:mem:testDB;DATABASE_TO_UPPER=false"
user = ""
password = ""
driver = "org.h2.Driver"
}
akka {
worker-dispatcher {
type = BalancingDispatcher
}
actor.deployment {
"/my-read-pool/*" {
dispatcher = akka.worker-dispatcher
}
}