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

Linear Supertypes
DIResourceBase[F, Resource], AnyRef, Any
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. DIResource
  2. DIResourceBase
  3. AnyRef
  4. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. Protected

Type Members

  1. final type InnerResource = Resource
    Definition Classes
    DIResourceDIResourceBase

Abstract Value Members

  1. abstract def acquire: F[Resource]
    Definition Classes
    DIResourceDIResourceBase
  2. abstract def release(resource: Resource): F[Unit]
    Definition Classes
    DIResourceDIResourceBase

Concrete Value Members

  1. final def !=(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  2. final def ##: Int
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  4. final def asInstanceOf[T0]: T0
    Definition Classes
    Any
  5. def clone(): AnyRef
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.CloneNotSupportedException]) @native()
  6. final def eq(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  7. def equals(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef → Any
  8. final def evalMap[G[x] >: F[x], B](f: (Resource) => G[B])(implicit arg0: DIEffect[G]): DIResourceBase[G, B]
    Definition Classes
    DIResourceBase
  9. final def evalTap[G[x] >: F[x]](f: (Resource) => G[Unit])(implicit arg0: DIEffect[G]): DIResourceBase[G, Resource]
    Definition Classes
    DIResourceBase
  10. final def extract(resource: Resource): Resource
    Definition Classes
    DIResourceDIResourceBase
  11. def finalize(): Unit
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.Throwable])
  12. final def flatMap[G[x] >: F[x], B](f: (Resource) => DIResourceBase[G, B])(implicit arg0: DIEffect[G]): DIResourceBase[G, B]
    Definition Classes
    DIResourceBase
  13. final def getClass(): Class[_ <: AnyRef]
    Definition Classes
    AnyRef → Any
    Annotations
    @native()
  14. def hashCode(): Int
    Definition Classes
    AnyRef → Any
    Annotations
    @native()
  15. final def isInstanceOf[T0]: Boolean
    Definition Classes
    Any
  16. final def map[B](f: (Resource) => B): DIResourceBase[F, B]
    Definition Classes
    DIResourceBase
  17. final def ne(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  18. final def notify(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native()
  19. final def notifyAll(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native()
  20. final def synchronized[T0](arg0: => T0): T0
    Definition Classes
    AnyRef
  21. def toString(): String
    Definition Classes
    AnyRef → Any
  22. final def void: DIResourceBase[F, Unit]
    Definition Classes
    DIResourceBase
  23. final def wait(): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException])
  24. final def wait(arg0: Long, arg1: Int): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException])
  25. final def wait(arg0: Long): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException]) @native()
  26. 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
  27. 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

Inherited from DIResourceBase[F, Resource]

Inherited from AnyRef

Inherited from Any

Ungrouped