【问题标题】:Guice override NamedCache bindingGuice 覆盖 NamedCache 绑定
【发布时间】:2018-03-14 08:13:35
【问题描述】:

我正在使用 Play 2.6 和 Play 缓存抽象。

我在应用程序中配置了 2 个缓存,名称分别为“x”和“y”。

在测试期间,我想用我的假缓存实现覆盖每个缓存。

缓存用@NamedCache("X") val cache: AsyncCacheApi@NamedCache("Y") val cache: AsyncCacheApi 注释,但我似乎无法在模块中覆盖它们:

    class FakeCacheModule extends AbstractModule {
      override def configure(): Unit = {
        bind(classOf[AsyncCacheApi]).annotatedWith(Names.named("X")).toInstance(new FakeCache)
        bind(classOf[AsyncCacheApi]).toInstance(new FakeCache)
        bind(classOf[AsyncCacheApi]).annotatedWith(Names.named("Y")).toInstance(new FakeCache)
      }
    }

这些绑定都不起作用。

【问题讨论】:

    标签: playframework guice ehcache


    【解决方案1】:

    Names.named("") 返回com.google.inject.name.Named 的实例,但缓存绑定使用play.cache.NamedCache 进行注释。

    Names.named()的实现是:

    public static Named named(String name) {
        return new NamedImpl(name);
    }
    

    您可以分别通过使用实现NamedCacheNamedCacheImpl 实例来获得NamedCache 注释的有效绑定。因此,一个可行的解决方案是

    class FakeCacheModule extends AbstractModule {
        override def configure(): Unit = {
            bind(classOf[AsyncCacheApi]).annotatedWith(new NamedCacheImpl("X")).toInstance(new FakeCache)
            bind(classOf[AsyncCacheApi]).toInstance(new FakeCache)
            bind(classOf[AsyncCacheApi]).annotatedWith(new NamedCacheImpl("Y")).toInstance(new FakeCache)
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2017-09-28
      • 2014-09-15
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多