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 inuserservice'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