EnvironmentがAny
だったり、あまり複雑でなければZIOAppDefault
を使えば良いですが、AService & BService & CService
みたいに複雑になると、それを参照するのも手間だったりします。
デフォルトから異なるEnvironmentを使う場合、ZIOApp
を継承して次のように実装できます。
import zio.*
object Main extends ZIOApp:
override type Environment =
AService & BService & CService & ... // 必要なサービスを列挙
override val environmentTag: EnvironmentTag[Environment] =
EnvironmentTag[Environment]
override val bootstrap: RLayer[ZIOAppArgs, Environment] =
AServiceImpl.layer ++ BServiceImpl.layer ++ CServiceImpl.layer ++ ... // サービス実装を列挙
def run: RIO[Environment, Unit] =
for _ <- MyService() // サービスを使った処理
yield ()
参考