2016-01-11 68 views
0

我使用DAO庫(ActiveSlick)用以下方法簽名:如何在Scala中添加隱式curried參數?

def save(entity: Entity)(implicit exc: ExecutionContext): DBIO[Entity] 

等多數有一個隱含的咖喱exc PARAM。

我在擴展這個類,並且想要將ExecutionContext附加到預定義的東西上,例如:implicit val context = Contexts.dbContext

另外,我裹純方法中:

def run[S] (action: DBIO[S]): Future[Try[S]] = db.run(action.asTry) 

然而,隱式上下文沒有得到客戶端代碼回升。

我能做的就是:

def run[S] (action: ExecutionContext => DBIO[S]): Future[Try[S]] = db.run(action(context).asTry) 

然而,這是醜陋的,因爲我必須在客戶端代碼中顯式咖喱:

dao.run (dao.insert(entity)(_)) 

我的問題是我是否能貼上隱ExecutionContext參數在我的班,這樣的電話總是乾淨的(呃):

dao.run (dao.insert (entity)) 

我聽說monad可以做這樣的事情..但是grokking它證明相當困難。

謝謝!

+0

我不想重寫所有的方法,但是找到一個通用的解決問題的辦法。通過覆蓋我的意思,例如:'重寫def插入(實體:實體)(隱式ctx:ExecutionContext)= super.insert(實體)(上下文)' – vivri

+0

抱歉,def應該是:'...(隱式ctx:ExecutionContext = someDefinedCtx )' – vivri

回答

0

定義特質像下面何地您需要它混吧:

trait ExeContext { 
    implicit def exe: ExecutionContext 
    //Methods that use the implicit exe 
} 
+0

不幸的是,這不會將隱式傳播給方法調用站點。一個複雜因素可能是我描述的是一個基類,但我也在後代中添加了一個隱含的上下文 - 並且它仍然在呼叫站點丟失。每當我找不到其他解決方案時,都很少輸入它。 – vivri

相關問題