Folks, I have been toying around with SqlFun and have some questions regarding its design choices. Considering the README, this is how you are supposed to write code on it:
module Database = // ... let createConnection () = new SqliteConnection("Data Source=:memory:") let config = createDefaultConfig createConnection let runAsync f = AsyncDb.run createConnection f module Repository = open Database // ... module Account = let create: Account -> AsyncDb<Account.Username> = sql config "INSERT INTO account (username, password) VALUES (@username, @password) RETURNING username;"
In this case, you can see that the module
Repository depends on the variable
config from the module
Database. In this sense, if I were to configure my string connection, I would have something like this:
module Configuration = // imagine some private logic happening here let sqlConnection = sprintfn "Data Source=%s" config.Database.Host module Database = open Configuration // ... let createConnection () = new SqliteConnection(sqlConnection)
It seems weird to me that this depends exclusively on runtime checks and not compile time checks, although I like how it works as you just evaluate things at the module execution. Anyway, my questions are:
- Is there a name for this kind of dependency injection strategy?
- Is this considered good?