首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >注入注入实例列表

注入注入实例列表
EN

Stack Overflow用户
提问于 2017-07-01 00:46:17
回答 1查看 734关注 0票数 1

我有一个公开方法的服务。我有一个该方法的实现,它可以聚合同一服务的其他实现的结果。如何通过注入将其他实现的列表注入到聚合实现中?例如:

我有一个提供get( s: String )方法的特征DictionaryProvider。我的MultipleDictionaryProvider实现可以聚合其他实现,比如OxfordDictionaryAndColorProviderWebsterDictionaryAndShapeProvider

代码语言:javascript
复制
    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 DictionaryProvider

OxfordDictionaryAndColorProviderWebsterDictionaryAndShapeProvider都是通过注入构造的。除了提供字典之外,它们都有一些作用,而且它们都有一个构造的单例实例,分别作为ColorProviderShapeProvider

我想把我的DictionaryProvider绑定到一个MultipleDictionaryProvider上。我应该如何做才能使l中的元素序列按照我想要的那样进行呢?(在这种情况下,先使用OxfordDictionaryAndColorProvider,然后使用WebsterDictionaryAndShapeProvider )(顺序应该很容易更改,并且只需要在一个地方更改)

编辑:我对问题进行了编辑,使其更清晰。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-01 02:59:05

如果您使用的是Guice,并且有一个固定的DictionaryProvider对象列表,那么一种简单的方法就是将DictonaryProvider绑定到MultipleDictionaryProvider,并在List[DictionaryProvider]的注入器模块中实现一个提供者方法

代码语言:javascript
复制
@Provides
def makeProviderList(
        oxford: OxfordDictionaryProvider,
        webster: WebsterDictionaryProvider): List[DictionaryProvider] =
    List(oxford, webster)

Guice将实例化OxfordDictinaryProviderWebsterDictionaryProvider,调用您的provider方法,并使用返回的列表实例化MultipleDictionaryProvider

如果要避免在提供程序函数签名中使用特定的类名,一种有用的技术是使用带注释的类型,例如使用@Named

代码语言:javascript
复制
@Provides
def makeProviderList(
    @Named("oxford") oxford: DictionaryProvider,
    @Named("webster") webster: DictionaryProvider) = List(oxford, webster)

虽然这段代码似乎仍然包含很多特定于字典的信息,但实现类实际上并没有指定,它们需要像这样绑定在模块类中:

代码语言:javascript
复制
bind(classOf[DictionaryProvider])
    .annotatedWith(Names.named("oxford"))
    .to(classOf[OxfordDictionaryProvider])

字典的数量和种类仍然是硬编码的。为了使其更灵活,您将需要自己掌握实例化:

代码语言:javascript
复制
val dictList = List("oxford", "webster")

@Provides
def makeProviderList(injector: Injector) =
    dictList.map(dictName => injector.getInstance(
        Key.get(classOf[DictionaryProvider], Names.named(dictName))))

请注意,dictList可以在运行时确定,甚至可以使用此绑定进行注入:

代码语言:javascript
复制
bind(Key.get(new TypeLiteral[List[String]](){}))
    .toInstance(List("oxford", "webster"))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44851391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档