บริการ stateful อ้างถึงอะไรในกรณีนี้
คุณหมายถึงว่ามันจะใช้ผลข้างเคียงเมื่อวัตถุถูกสร้างขึ้น?
สำหรับสิ่งนี้ความคิดที่ดีกว่าคือการมีวิธีการใช้ผลข้างเคียงเมื่อแอปพลิเคชันของคุณเริ่มทำงาน แทนที่จะวิ่งระหว่างก่อสร้าง
หรือคุณกำลังบอกว่ามันมีสถานะที่ไม่แน่นอนในการให้บริการ? ตราบใดที่ไม่สามารถเปิดเผยสถานะภายในได้ก็ควรเป็นไร คุณเพียงแค่ต้องให้วิธีบริสุทธิ์ (อ้างอิงโปร่งใส) เพื่อสื่อสารกับบริการ
หากต้องการขยายในจุดที่สองของฉัน:
สมมติว่าเรากำลังสร้างฐานข้อมูลหน่วยความจำ
class InMemoryDB(private val hashMap: ConcurrentHashMap[String, String]) {
def getId(s: String): IO[String] = ???
def setId(s: String): IO[Unit] = ???
}
object InMemoryDB {
def apply(hashMap: ConcurrentHashMap[String, String]) = new InMemoryDB(hashMap)
}
IMO สิ่งนี้ไม่จำเป็นต้องมีผลบังคับใช้เนื่องจากมีสิ่งเดียวกันเกิดขึ้นหากคุณทำการโทรผ่านเครือข่าย แม้ว่าคุณจะต้องตรวจสอบให้แน่ใจว่ามีเพียงอินสแตนซ์เดียวของคลาสนี้
หากคุณใช้Ref
จาก cat-effect สิ่งที่ฉันจะทำตามปกติคือไปยังflatMap
จุดอ้างอิงที่จุดเริ่มต้นดังนั้นชั้นเรียนของคุณไม่จำเป็นต้องมีประสิทธิภาพ
object Effectful extends IOApp {
class InMemoryDB(storage: Ref[IO, Map[String, String]]) {
def getId(s: String): IO[String] = ???
def setId(s: String): IO[Unit] = ???
}
override def run(args: List[String]): IO[ExitCode] = {
for {
storage <- Ref.of[IO, Map[String, String]](Map.empty[String, String])
_ = app(storage)
} yield ExitCode.Success
}
def app(storage: Ref[IO, Map[String, String]]): InMemoryDB = {
new InMemoryDB(storage)
}
}
OTOH ถ้าคุณกำลังเขียนบริการสาธารณะหรือห้องสมุดที่ขึ้นอยู่กับวัตถุที่เป็นรัฐ (สมมติว่ามีการทำงานพร้อมกันหลายตัว) และคุณไม่ต้องการให้ผู้ใช้สนใจสิ่งที่จะเริ่มต้น
จากนั้นใช่จะต้องถูกห่อด้วยเอฟเฟกต์ คุณสามารถใช้สิ่งที่ต้องการResource[F, MyStatefulService]
เพื่อให้แน่ใจว่าทุกอย่างถูกปิดอย่างถูกต้อง หรือF[MyStatefulService]
ถ้าไม่มีอะไรจะปิด
delay
และกลับF [บริการ] เป็นตัวอย่างดูstart
วิธีการในIOมันส่งคืนIO [ไฟเบอร์ [IO,?]]แทนเส้นใยธรรมดา