Dropwizard和Guice:注入环境

Cpt*_*ard 7 dependency-injection guice jdbi dropwizard

我目前正在构建一个Dropwizard + Guice + Jersey-based应用程序,其中数据库访问暂时由JDBI处理.

我想要实现的是拥有典型的企业架构,其中Resources访问服务类访问DAO类,而DAO类又访问数据库.如果所有其他方法都失败了,我想我可以在应用程序的run()方法中构建我的对象图,这将很高兴以正确的DI方式连接所有这些.

所以,我遇到了之前提到的这个问题:获取DBIFactory需要环境和配置,当Guice执行注入魔法而不是run()时,它需要在某种程度上可用. .

作为一个Dropwizard和Guice noob,到目前为止我设法把它放在一起就是我需要一个Provider来为我的DAO对象提供一些东西.

public class UserDAOProvider implements Provider<UserDAO> {

    @Inject
    Environment environment;
    @Inject
    Configuration configuration;

    @Override
    public UserDAO get() {
        final DBIFactory factory = new DBIFactory();
        final (MyConfiguration) config = (MyConfiguration) configuration;
        DBI jdbi = null;
        try {
            jdbi = factory.build(environment, config.getDataSourceFactory(),
                    "mysql");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return jdbi.onDemand(UserDAO.class);
    }

}
Run Code Online (Sandbox Code Playgroud)

将此注册为单身提供商应该让我将UserDAO注入我的服务.

现在,我们如何实际将环境注入到Provider中?目前我被困在Guice抱怨没有为环境找到合适的构造函数,所以它试图实例化它而不是从Dropwizard本身获取它.

看起来这是可行的; 有一个dropwizard-guice包,我认为DropWizardEnvironmentModule是我需要的.但我觉得我只是错过了一些难题,以便了解如何将事情放在一起.到目前为止,我还没有找到一个完整的工作示例......

Abh*_*she 4

这就是我使用 Guice 和 Dropwizard 的方式。在 run() 方法中添加以下行

Guice.createInjector(new ConsoleModule()); 
Run Code Online (Sandbox Code Playgroud)

您不能注入 Environ

创建类 ConsoleModule

public class ConsoleModule extends AbstractModule {

    //configuration and env variable declaration

    public  ConsoleModule(ConsoleConfiguration consoleConfig, Environment env)
    {
        this.consoleConfig = consoleConfig;
        this.env= env;
    }

    protected void configure()
    {
        //You should not inject Configuration and Environment in your provider since you are mixing     
        //dropwizard framework stuff with Guice.Neverthless you will have to bind them in the below order

        bind(Configuration.class).toInstance(consoleConfig.class);
        bind(Environment.class).toInstance(env.class);
        bind(UserDAO.class).toProvider(UserDAOProvider.class).in(Singleton.class);
    }
}
Run Code Online (Sandbox Code Playgroud)