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