রাষ্ট্রীয় পরিষেবা এই ক্ষেত্রে কী বোঝায়?
আপনি কী বোঝাতে চাইছেন যে কোনও বস্তুটি নির্মিত হলে এটি কোনও পার্শ্ব প্রতিক্রিয়াটি কার্যকর করবে?
এর জন্য, আরও ভাল ধারণা হ'ল আপনার অ্যাপ্লিকেশন শুরু হওয়ার সাথে সাথে এমন কোনও পদ্ধতি থাকা যা পার্শ্ব প্রতিক্রিয়াটি চালায়। পরিবর্তে এটি নির্মাণের সময় চালানো।
অথবা হতে পারে আপনি বলছেন যে এটি পরিষেবার অভ্যন্তরে একটি পরিবর্তনীয় অবস্থা ধরে রেখেছে? যতক্ষণ না অভ্যন্তরীণ পরিবর্তনযোগ্য অবস্থা প্রকাশিত হয় না ততক্ষণ এটি ঠিক হয়ে যাওয়া উচিত। পরিষেবার সাথে যোগাযোগের জন্য আপনাকে কেবল একটি খাঁটি (সাধারণভাবে স্বচ্ছ) পদ্ধতি সরবরাহ করতে হবে।
আমার দ্বিতীয় পয়েন্টটি প্রসারিত করতে:
ধরা যাক আমরা একটি মেমরি ডিবি নির্মাণ করছি।
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)
}
আইএমও, এটি কার্যকর হওয়ার দরকার নেই, আপনি যদি নেটওয়ার্ক কল করেন তবে একই জিনিসটি ঘটছে। যদিও, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে এই শ্রেণীর একমাত্র উদাহরণ রয়েছে।
আপনি যদি 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)
}
}
ওটিওহ, আপনি যদি কোনও শেয়ার্ড সার্ভিস বা একটি লাইব্রেরি লিখছেন যা রাষ্ট্রীয় অবজেক্টের উপর নির্ভরশীল (একাধিক সম্মতিমূলক আদিমন্ত্রীরা বলি) এবং আপনি চান না যে আপনার ব্যবহারকারীরা কী শুরু করতে হবে সেদিকে খেয়াল রাখুক।
তারপরে, হ্যাঁ, এটি একটি প্রভাব আবৃত করা আবশ্যক। আপনি Resource[F, MyStatefulService]
সবকিছু ঠিকঠাকভাবে বন্ধ আছে কিনা তা নিশ্চিত করতে আপনি এর মতো কিছু ব্যবহার করতে পারেন । বা F[MyStatefulService]
বন্ধ করার মতো কিছুই যদি না থাকে।
delay
এবং একটি এফ [পরিষেবা] ফিরিয়ে দেওয়া উচিত । উদাহরণ হিসাবে, আইও-start
তে পদ্ধতিটি দেখুন , এটি প্লেইন ফাইবারের পরিবর্তে একটি আইও [ফাইবার [আইও,?]] প্রদান করে ।