我有一个公开方法的服务。我有一个该方法的实现,它可以聚合同一服务的其他实现的结果。如何通过注入将其他实现的列表注入到聚合实现中?例如:
我有一个提供get( s: String )方法的特征DictionaryProvider。我的MultipleDictionaryProvider实现可以聚合其他实现,比如OxfordDictionaryAndColorProvider和WebsterDictionaryAndShapeProvider。
class OxfordDictionaryAndColorProvider (p: Param ) extends DictionaryProvider with ColorProvider
class WebsterDictionaryAndShapeProvider extends DictionaryProvider with ShapeProvider
class MultipleDictionaryProvider(
l: List[ DictionaryProvider ]
)
{
def get(){ /*Sequence of l matters*/ }
}
extends DictionaryProviderOxfordDictionaryAndColorProvider和WebsterDictionaryAndShapeProvider都是通过注入构造的。除了提供字典之外,它们都有一些作用,而且它们都有一个构造的单例实例,分别作为ColorProvider和ShapeProvider。
我想把我的DictionaryProvider绑定到一个MultipleDictionaryProvider上。我应该如何做才能使l中的元素序列按照我想要的那样进行呢?(在这种情况下,先使用OxfordDictionaryAndColorProvider,然后使用WebsterDictionaryAndShapeProvider )(顺序应该很容易更改,并且只需要在一个地方更改)
编辑:我对问题进行了编辑,使其更清晰。
发布于 2017-07-01 02:59:05
如果您使用的是Guice,并且有一个固定的DictionaryProvider对象列表,那么一种简单的方法就是将DictonaryProvider绑定到MultipleDictionaryProvider,并在List[DictionaryProvider]的注入器模块中实现一个提供者方法
@Provides
def makeProviderList(
oxford: OxfordDictionaryProvider,
webster: WebsterDictionaryProvider): List[DictionaryProvider] =
List(oxford, webster)Guice将实例化OxfordDictinaryProvider和WebsterDictionaryProvider,调用您的provider方法,并使用返回的列表实例化MultipleDictionaryProvider。
如果要避免在提供程序函数签名中使用特定的类名,一种有用的技术是使用带注释的类型,例如使用@Named
@Provides
def makeProviderList(
@Named("oxford") oxford: DictionaryProvider,
@Named("webster") webster: DictionaryProvider) = List(oxford, webster)虽然这段代码似乎仍然包含很多特定于字典的信息,但实现类实际上并没有指定,它们需要像这样绑定在模块类中:
bind(classOf[DictionaryProvider])
.annotatedWith(Names.named("oxford"))
.to(classOf[OxfordDictionaryProvider])字典的数量和种类仍然是硬编码的。为了使其更灵活,您将需要自己掌握实例化:
val dictList = List("oxford", "webster")
@Provides
def makeProviderList(injector: Injector) =
dictList.map(dictName => injector.getInstance(
Key.get(classOf[DictionaryProvider], Names.named(dictName))))请注意,dictList可以在运行时确定,甚至可以使用此绑定进行注入:
bind(Key.get(new TypeLiteral[List[String]](){}))
.toInstance(List("oxford", "webster"))https://stackoverflow.com/questions/44851391
复制相似问题