関数に対してDI
案
カリー化する
これはDIとは言わないと思うけどmrsekut.icon
引数として渡す
この辺はmonadが無いと無理
その他
定義の仕方が若干キモいけど、わからんではない
よく知らん
カリー化する
code:usecases.ts
async function usecase() {
const result = await repository();
return result
}
code:repositoeis.ts
// test時はこれをexport
const getUsersRepository = (DB:DB) => async () => {
const result = await DB.get(SELECT * FROM users WHERE id = ?);
return result;
}
const db:DB = {}
// 通常はこれをexport
const repository = getUsersRepository(db)
Test Stubを使う
これで良くない?mrsekut.icon
引数として渡す
ReaderやFreeを使わない単純なアプローチ
依存を関数の頭から全部入れて、バケツリレーしていく感じ
code:fs
let placeOrder
checkProductExists // dependency
checkAddressExists // dependency
getProductPrice // dependency
createOrderAcknowledgmentLetter // dependency
sendOrderAcknowledgment // dependency
: PlaceOrder = // definition of function
fun unvalidatedOrder -> ..
ちなみに、これらのdependencyは値ではなく関数
main関数で全部のdependencyをinjectionする
main関数が冗長になるが仕方がない
まあガチのdependencyならこれでもいいか。
問題はテストしたいだけなのに、ここまでしないといけないのか、という点mrsekut.icon
節の最後の方では、カリー化する例も書いてあった
Haskell で Dependency Injection を実現する方法の一つとして Service パターンを紹介している記事👀
DIの対象をレコード型で定義して関数の引数で渡すというシンプルなもの。RIO や Handle パターンなど他の手法との比較も書いてある