Ole*_*ako 2 dependency-injection scala lift implicit-conversion
有没有办法使这项工作(Scala 2.8.1):
class A
class B
def f(implicit b: B) {}
implicit val a = new A
implicit def aToB(a: A) = new B
f(a) // works ok
f // error: could not find implicit value for parameter b: B
Run Code Online (Sandbox Code Playgroud)
其实我的问题是与Lift的(2.2)的依赖注入,我试图给供应商[T]转换为T和隐含需要它在类的构造函数,而不每一VAL之后增加进口:
object DependencyFactory extends Factory {
implicit def vendorToVal[T](vendor: Vendor[T]): T = vendor.vend
implicit val db = new FactoryMaker[DbAccess](Model) {}
//uncommenting the following line makes it work, but can we avoid it?
//import db._
implicit val userStore = new FactoryMaker[UserStore](new UserStore) {}
}
Run Code Online (Sandbox Code Playgroud)
在哪里UserStore
:
class UserStore(implicit db: DbAccess)
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?
UPDATE
感谢Easy Angel回答第一部分.但它并没有解决我的Lift DI问题,因为事实证明在范围内(从T到Vendor [T])存在相反的转换,并且两者都导致'错误:分歧隐式扩展'.
可以解决吗?
UPDATE2
之前又遇到了一个问题:从一些Container [T]到T的转换,范围内的Container [U]的隐式实例和一个带隐式参数U的函数也会导致'分散隐式扩展':
class A
case class Vendor[T](v: T)
def f(implicit a: A) {}
implicit val vendor = Vendor(new A)
implicit def vendorToVal[T](implicit v: Vendor[T]) = v.v
f
Run Code Online (Sandbox Code Playgroud)
任何提示?
你几乎成功了.您只需要声明a
隐式:
implicit def aToB(implicit a: A) = new B
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器试图找到一些隐性B
的第一隐含参数f
和发现aToB
.比编译器关系满足aToB
的要求(implicit a: A
)并找到你的implicit val a
.