-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
60 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,3 +18,11 @@ Executing query: insert into subscribers(name, email) values Daniel daniel@Rockt | |
You've just been subscribed to RockTheJVM. Welcome, Martin | ||
Acquired connection | ||
Executing query: insert into subscribers(name, email) values Martin [email protected] | ||
|
||
Injected2 | ||
You've just been subscribed to RockTheJVM. Welcome, Daniel | ||
Acquired connection | ||
Executing query: insert into subscribers(name, email) values Daniel [email protected] | ||
You've just been subscribed to RockTheJVM. Welcome, Martin | ||
Acquired connection | ||
Executing query: insert into subscribers(name, email) values Martin [email protected] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -65,6 +65,8 @@ end Providers | |
Explicit().test() | ||
println(s"\nInjected") | ||
Injected().test() | ||
println(s"\nInjected2") | ||
Injected2().test() | ||
|
||
/** Demonstrator for explicit dependency construction */ | ||
class Explicit: | ||
|
@@ -173,5 +175,55 @@ class Injected: | |
end explicit | ||
end Injected | ||
|
||
/** Injected with builders in companion objects */ | ||
class Injected2: | ||
import Providers.* | ||
|
||
case class User(name: String, email: String) | ||
|
||
class UserSubscription(emailService: EmailService, db: UserDatabase): | ||
def subscribe(user: User) = | ||
emailService.email(user) | ||
db.insert(user) | ||
object UserSubscription: | ||
def apply()(using Provider[(EmailService, UserDatabase)]): UserSubscription = | ||
new UserSubscription(provided[EmailService], provided[UserDatabase]) | ||
|
||
class EmailService: | ||
def email(user: User) = | ||
println(s"You've just been subscribed to RockTheJVM. Welcome, ${user.name}") | ||
|
||
class UserDatabase(pool: ConnectionPool): | ||
def insert(user: User) = | ||
pool.get().runQuery(s"insert into subscribers(name, email) values ${user.name} ${user.email}") | ||
object UserDatabase: | ||
def apply()(using Provider[(ConnectionPool)]): UserDatabase = | ||
new UserDatabase(provided[ConnectionPool]) | ||
|
||
class ConnectionPool(n: Int): | ||
def get(): Connection = | ||
println(s"Acquired connection") | ||
Connection() | ||
|
||
class Connection(): | ||
def runQuery(query: String): Unit = | ||
println(s"Executing query: $query") | ||
|
||
def test() = | ||
given Provider[EmailService] = provide(EmailService()) | ||
given Provider[ConnectionPool] = provide(ConnectionPool(10)) | ||
given Provider[UserDatabase] = provide(UserDatabase()) | ||
given Provider[UserSubscription] = provide(UserSubscription()) | ||
|
||
def subscribe(user: User)(using Provider[UserSubscription]) = | ||
val sub = UserSubscription() | ||
sub.subscribe(user) | ||
|
||
subscribe(User("Daniel", "[email protected]")) | ||
subscribe(User("Martin", "[email protected]")) | ||
end test | ||
end Injected2 | ||
|
||
|
||
|
||
|