स्टेटफुल सर्विस इस मामले में क्या संदर्भित करती है?
क्या आपका मतलब है कि किसी वस्तु का निर्माण होने पर यह एक दुष्प्रभाव पर अमल करेगा?
इसके लिए, एक बेहतर विचार एक तरीका होगा जो आपके आवेदन शुरू होने पर साइड इफेक्ट चलाता है। निर्माण के दौरान इसे चलाने के बजाय।
या हो सकता है कि आप कह रहे हों कि यह सेवा के अंदर एक परस्पर स्थिति रखता है? जब तक आंतरिक उत्परिवर्तनीय स्थिति उजागर नहीं होती है, तब तक यह ठीक होना चाहिए। आपको बस सेवा के साथ संचार करने के लिए एक शुद्ध (संदर्भित पारदर्शी) विधि प्रदान करने की आवश्यकता है।
मेरे दूसरे बिंदु पर विस्तार करने के लिए:
मान लें कि हम मेमोरी डीबी में निर्माण कर रहे हैं।
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
बिल्लियों-प्रभाव का उपयोग कर रहे हैं , तो मैं सामान्य रूप से क्या करूंगा, 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
और एक एफ [सेवा] वापस करना चाहिए । एक उदाहरण के रूप में, IOstart
पर विधि देखें , यह सादे फाइबर के बजाय एक IO [फाइबर [IO?]]] देता है ।