trait DIResource[+F[_], Resource] extends DIResourceBase[F, Resource]
DIResource
is a class that captures the effectful allocation of a resource, along with its finalizer.
This can be used to wrap expensive resources.
Resources can be created using DIResource.make:
def open(file: File): DIResource[IO, BufferedReader] = DIResource.make(IO { new BufferedReader(new FileReader(file)) })(in => IO { in.close() })
Using inheritance from DIResource:
final class BufferedReaderResource(file: File) extends DIResource[IO, BufferedReader] { val acquire = IO { new BufferedReader(new FileReader(file)) } def release(in: BufferedReader) = IO { in.close() } }
Using constructor-based inheritance from DIResource.Make, DIResource.LiftF, etc:
final class BufferedReaderResource(file: File) extends DIResource.Make[IO, BufferedReader]( acquire = IO { new BufferedReader(new FileReader(file)) }, release = in => IO { in.close() }, }
Or by converting an existing cats.effect.Resource or a zio.ZManaged. Use DIResource.fromCats, DIResource.DIResourceCatsSyntax#toCats and DIResource.fromZIO, DIResource.DIResourceZIOSyntax#toZIO to convert back and forth.
Usage is done via use:
open(file1).use { in1 => open(file2).use { in2 => readFiles(in1, in2) } }
DIResources can be combined into a larger resource via DIResourceBase.flatMap:
val res: DIResource[IO, (BufferedReader, BufferedReader)] = open(file1).flatMap { in1 => open(file2).flatMap { in2 => IO.pure(in1 -> in2) } }
Nested resources are released in reverse order of acquisition. Outer resources are released even if an inner use or release fails.
DIResource
can be used in non-FP context with DIResource.Simple
it can also mimic Java's initialization-after-construction with DIResource.Mutable
Use DIResource's to specify lifecycles of objects injected into the object graph.
import distage.{DIResource, ModuleDef, Injector} import cats.effect.IO class DBConnection class MessageQueueConnection val dbResource = DIResource.make(IO { println("Connecting to DB!"); new DBConnection })(_ => IO(println("Disconnecting DB"))) val mqResource = DIResource.make(IO { println("Connecting to Message Queue!"); new MessageQueueConnection })(_ => IO(println("Disconnecting Message Queue"))) class MyApp(db: DBConnection, mq: MessageQueueConnection) { val run = IO(println("Hello World!")) } val module = new ModuleDef { make[DBConnection].fromResource(dbResource) make[MessageQueueConnection].fromResource(mqResource) make[MyApp] } Injector().produceFGet[IO, MyApp](module) .use(_.run()) .unsafeRunSync()
Will produce the following output:
Connecting to DB! Connecting to Message Queue! Hello World! Disconnecting Message Queue Disconnecting DB
The lifecycle of the entire object graph is itself expressed with DIResource
,
you can control it by controlling the scope of .use
or by manually invoking
DIResourceBase.acquire and DIResourceBase.release.
- See also
ModuleDef.fromResource: izumi.distage.model.definition.dsl.ModuleDefDSL.MakeDSLBase#fromResource cats.effect.Resource: https://typelevel.org/cats-effect/datatypes/resource.html zio.ZManaged: https://zio.dev/docs/datatypes/datatypes_managed
- Alphabetic
- By Inheritance
- DIResource
- DIResourceBase
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Type Members
- final type InnerResource = Resource
- Definition Classes
- DIResource → DIResourceBase
Abstract Value Members
- abstract def acquire: F[Resource]
- Definition Classes
- DIResource → DIResourceBase
- abstract def release(resource: Resource): F[Unit]
- Definition Classes
- DIResource → DIResourceBase
Concrete Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##: Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native()
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- final def evalMap[G[x] >: F[x], B](f: (Resource) => G[B])(implicit arg0: DIEffect[G]): DIResourceBase[G, B]
- Definition Classes
- DIResourceBase
- final def evalTap[G[x] >: F[x]](f: (Resource) => G[Unit])(implicit arg0: DIEffect[G]): DIResourceBase[G, Resource]
- Definition Classes
- DIResourceBase
- final def extract(resource: Resource): Resource
- Definition Classes
- DIResource → DIResourceBase
- def finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable])
- final def flatMap[G[x] >: F[x], B](f: (Resource) => DIResourceBase[G, B])(implicit arg0: DIEffect[G]): DIResourceBase[G, B]
- Definition Classes
- DIResourceBase
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- final def map[B](f: (Resource) => B): DIResourceBase[F, B]
- Definition Classes
- DIResourceBase
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- final def void: DIResourceBase[F, Unit]
- Definition Classes
- DIResourceBase
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()
- final def wrapAcquire[G[x] >: F[x]](f: (=> G[InnerResource]) => G[InnerResource]): DIResourceBase[G, Resource]
Wrap acquire action of this resource in another effect, e.g.
Wrap acquire action of this resource in another effect, e.g. for logging purposes
- Definition Classes
- DIResourceBase
- final def wrapRelease[G[x] >: F[x]](f: ((InnerResource) => G[Unit], InnerResource) => G[Unit]): DIResourceBase[G, Resource]
Wrap release action of this resource in another effect, e.g.
Wrap release action of this resource in another effect, e.g. for logging purposes
- Definition Classes
- DIResourceBase