1

我正在使用球衣和 Guice DI,我想使用带有@Inject注释的 Mapstruct 接口。那么有什么方法可以强制 Guice 自动装配 Mapstruct 接口实现吗?

4

3 回答 3

3

您可以使用 JSR 330 注解配置 Mappers 的实现@Mapper(componentModel = "jsr330")。您可以在 中找到更多信息reference documentation

然后,您可以将 Mapper 接口与模块中的实现类绑定。

绑定它们的一种方法是使用 Guice Linked Bindings

bind(MyDtoMapper.class).to(MyDtoMapperImpl.class)

绑定它们的另一种方法是使用Instance Bindings

bind(MyDtoMapper.class).toInstance(MyDtoMapper.INSTANCE)
于 2017-04-13T00:32:03.693 回答
0

遇到使用 Guice 和 jsr330 componentModel 的问题,尽管我不记得它们到底是什么。我的用例有点复杂,因为我还需要将另一个服务传递给映射器装饰器。也应该适用于您的简单案例。最终在 Guice 模块中执行提供程序方法,如下所示:

public YourModule  extends AbstractModule {
    //With Decorator
    @Provides
    @Singleton
    FooMapper providesFooMapper(RequiredService requiredSvc) {
        FooMapper mapper = Mappers.getMapper(FooMapper.class);
        ((FooMapperDecorator) mapper).setRequiredService(requiredSvc);
        return mapper;
    }

    //Simple Mapper with no dependencies
    @Provides
    @Singleton
    BarMapper providesBarMapper() {
        return Mappers.getMapper(BarMapper.class);
    }
}

工作顺利,但我希望 MapStruct 在某些时候干净地处理简单的案例。我还要注意我只使用构造函数注入;除了 YMMV 之外,setter 注入应该同样有效。

于 2017-04-25T20:00:51.377 回答
0

谢谢@Filip 。所以是@Mapper(componentModel = "jsr330")的,几乎所有的工作都是我必须为我直接在我的代码中使用的每个映射器创建绑定,bind(MyDtoMapper.class).toInstance(MyDtoMapper.INSTANCE)并且 INSTANCE 在 MyDtoMapper 接口中以这种方式声明:MyDtoMapper INSTANCE = Mappers.getMapper( MyDtoMapper.class );

于 2017-05-05T12:53:02.870 回答