簡體   English   中英

Scala:通過Reader和兼容性的依賴注入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM