Tuesday, 15 February 2011

Can I say this scala code is dependency injected? -



Can I say this scala code is dependency injected? -

i've read articles scala's cake pattern, understood it. next sample code copied article:

components:

case class user(username:string, password: string) trait userrepositorycomponent { val userrepository: userrepository class userrepository { def authenticate(user: user): user = { println("authenticating user: " + user) user } def create(user: user) = println("creating user: " + user) def delete(user: user) = println("deleting user: " + user) } } trait userservicecomponent { this: userrepositorycomponent => val userservice: userservice class userservice { def authenticate(username: string, password: string): user = userrepository.authenticate(user(username, password)) def create(username: string, password: string) = userrepository.create(new user(username, password)) def delete(user: user) = userrepository.delete(user) } }

objects combine them:

object componentregistry extends userservicecomponent userrepositorycomponent { val userrepository = new userrepository val userservice = new userservice } object testingcomponentregistry extends userservicecomponent userrepositorycomponent { val userrepository = mock[userrepository] val userservice = mock[userservice] }

i want create simpler if i'm in simple project. code like:

case class user(username:string, password: string) class userrepository { def authenticate(user: user): user = { println("authenticating user: " + user) user } def create(user: user) = println("creating user: " + user) def delete(user: user) = println("deleting user: " + user) } class userservice(userrepository: userrepository) { def authenticate(username: string, password: string): user = userrepository.authenticate(user(username, password)) def create(username: string, password: string) = userrepository.create(new user(username, password)) def delete(user: user) = userrepository.delete(user) }

combine them:

object application { val userservice = new userservice(new userrepository) } object test { val userservice = new userservice(mock[userrepository]) }

my question is, code can still treated "dependency injected"?

i declared dependencies in userservice's constructor i combine them objects in different environments

but don't provide trait "components".

yes code "dependency injected": userservice receives component supposed utilize constructor argument, opposed having userrepository straight instantiated within userservice.

imho, code exactly di should 90+% of time. no need "fancy" frameworks spring or guice, no need "fancy" design patterns cake pattern, inject dependencies in constructor. done, clean, testable, easy swap out different implementation (*).

(*): note accomplish in illustration userrepository should trait instead of class.

scala dependency-injection cake-pattern

No comments:

Post a Comment