-
-
Save wallymathieu/68b14bcd3e45c4c5b040b60c558a5318 to your computer and use it in GitHub Desktop.
F# : Onion architecture in a nutshell
This file contains hidden or 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
| // 1. pure, don't think about IO at all | |
| module Domain = | |
| let add x y = x + y | |
| // 2. think about IO but not its implementation | |
| module App = | |
| let add (getX: unit -> Async<int32>) y = | |
| async { | |
| let! x = getX () | |
| return Domain.add x y | |
| } | |
| // 3. IO implementation | |
| module Infra = | |
| let getX () = async { return 7 } | |
| // 4. inject dependencies | |
| module Startup = | |
| let add = App.add Infra.getX | |
| // demo | |
| Startup.add 3 | |
| |> Async.RunSynchronously | |
| |> printfn "%A" // 10 |
This file contains hidden or 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
| // 1. pure, don't think about IO at all | |
| module Domain = | |
| let add x y = x + y | |
| // 2. think about IO but not its implementation | |
| module App = | |
| let add (getX: unit -> Async<int32>) y = | |
| async { | |
| let! x = getX () | |
| return Domain.add x y | |
| } | |
| // 3. IO implementation | |
| module Infra = | |
| open System.Data.SqlClient | |
| let newConnection () = new SqlConnection () | |
| let getX conn = async { return 7 } | |
| // 4. inject dependencies | |
| module Startup = | |
| let add y = | |
| async { | |
| use conn = Infra.newConnection () | |
| return! App.add (fun () -> Infra.getX conn) y | |
| } | |
| // demo | |
| Startup.add 3 | |
| |> Async.RunSynchronously | |
| |> printfn "%A" // 10 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment