이 경우 상태 저장 서비스는 무엇을 의미합니까?
객체가 생성 될 때 부작용이 발생한다는 의미입니까?
이를 위해 더 좋은 아이디어는 응용 프로그램이 시작될 때 부작용을 실행하는 방법을 갖는 것입니다. 시공 중에 달리는 대신.
아니면 서비스 내부에서 변경 가능한 상태를 유지한다고 말하고 있습니까? 내부 변경 가능 상태가 노출되지 않는 한 괜찮습니다. 서비스와 통신하기 위해 순수한 (참조 적으로 투명한) 방법을 제공하면됩니다.
두 번째 요점을 확장하려면 :
메모리 DB를 구성한다고 가정 해 봅시다.
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
cats-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 [Service]를 반환 해야합니다 . 예를 들어 IO 의start
메소드를 참조 하면 일반 광섬유 대신 IO [Fiber [IO,?]]를 반환합니다 .