Created
December 6, 2020 15:23
-
-
Save mrange/b2dfbafcb41b42fb59ba1a7d02bd396f to your computer and use it in GitHub Desktop.
Testing ideas wrt to DI in F#
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
module Log = | |
open Printf | |
type LogLevel = | |
| Meltdown = 0b00000001 | |
| Error = 0b00000010 | |
| Warning = 0b00000100 | |
| Info = 0b00001000 | |
| Success = 0b00010000 | |
type [<AbstractClass>] Logger = | |
class | |
abstract Log: LogLevel -> string -> unit | |
end | |
type ILogProvider = | |
interface | |
abstract Logger: Logger | |
end | |
let log (env : #ILogProvider) logLevel msg = env.Logger.Log logLevel msg | |
let meltdown env msg = log env LogLevel.Meltdown msg | |
let error env msg = log env LogLevel.Error msg | |
let warning env msg = log env LogLevel.Warning msg | |
let info env msg = log env LogLevel.Info msg | |
let success env msg = log env LogLevel.Success msg | |
let meltdownf env fmt = kprintf (meltdown env) fmt | |
let errorf env fmt = kprintf (error env) fmt | |
let warningf env fmt = kprintf (warning env) fmt | |
let infof env fmt = kprintf (info env) fmt | |
let successf env fmt = kprintf (success env) fmt | |
module Storage = | |
type [<AbstractClass>] Repository = | |
class | |
abstract Write: string -> 'T -> unit | |
abstract TryRead: string -> 'T option | |
end | |
type IRepositoryProvider = | |
interface | |
abstract Repository: Repository | |
end | |
let write (env : #IRepositoryProvider) id o = | |
env.Repository.Write id o | |
let tryRead (env : #IRepositoryProvider) id = | |
env.Repository.TryRead id | |
module MyModule = | |
open Log | |
open Storage | |
type User = { | |
Id : string | |
FirstName : string | |
LastName : string | |
} | |
let doStuff env = | |
try | |
info env "Starting up..." | |
match tryRead env "123" with | |
| Some (u : User) -> infof env "User: %A" u | |
| None -> warning env "No user!" | |
info env "Done!" | |
finally | |
error env "Oops!" | |
[<EntryPoint>] | |
let main argv = | |
printfn "Hello World from F#!" | |
0 // return an integer exit code |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment