[英]Scala: Dependency Injection via Reader and compatibility
當我們通過Reader實現DI時,我們將依賴項作為方法簽名的一部分。 假設我們有(沒有實現):
trait Service1 { def f1:Int = ??? }
trait Service2 { def f2:Reader[Service1, Int] = ??? }
type Env= (Service1, Service2)
def c:Reader[Env, Int] = ??? //use Service2.f2 here
現在, f2
需要額外的服務來實現,比如說:
trait Service3
type Service2Env = (Service1, Service3)
//new dependecies on both:
trait Service2 { def f2:Reader[Service2Env, Int] = ??? }
這將打破現有的客戶,他們不能再使用Service2.f2
不提供Service3
還。
使用DI via注入(通過構造函數或setter),這在OOP中是常見的,我將使用c
作為僅依賴於Service2
的依賴。 它是如何構造的以及它的依賴列表是什么,我不在乎。 從這一點來看, Service2
任何新依賴項都將保持c
函數的簽名不變。
如何用FP方式解決? 有選擇嗎? 有沒有辦法注入新的依賴項,但以某種方式保護客戶免受變化?
有沒有辦法注入新的依賴項,但以某種方式保護客戶免受變化?
這會破壞目的,因為使用Reader(或者Final Tagless或ZIO Environment)是一種在每個函數的類型簽名中顯式聲明(直接和間接)依賴關系的方法。 您這樣做是為了能夠跟蹤代碼中使用這些依賴項的位置 - 只需查看函數簽名就可以判斷此代碼是否具有戲劇性的副作用,例如發送電子郵件(或者可能)你是出於其他原因這樣做,但結果是一樣的)。
您可能希望將此與構造函數注入混合並匹配,以用於不需要該級別靜態檢查的依賴項/效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.