6


1

Guiceを使用したコンストラクター注入

工場を使用しているサンプルコードがあります。 ファクトリを削除してコードをクリーンアップし、代わりにGuiceを使用したいと思います。 これを試みましたが、小さな障害にぶつかりました。 私は本当にGuiceが初めてなので、誰かがここで助けてくれることを望んでいます。

既存のクライアントコード(工場を使用):

public class MailClient {

    public static void main(String[] args) {
        MailConfig config = MailConfigFactory.get();
        config.setHost("smtp.gmail.com");
        Mail mail = MailFactory.get(config);
        mail.send();
    }
}

Guiceを使用したリファクタリングの試み:

//Replaces existing factories
public class MailModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(Mail.class)
        .to(MailImpl.class);

        bind(MailConfig.class)
        .to(MailConfigImpl.class);
    }
}

public class MailImpl implements Mail {

    private final MailConfig config;

    @Inject
    public MailImpl(MailConfig config) {
        this.config = config;
    }

    public void send() { ... }
}

public class MailClient {

    public static void main(String[] args) {
        MailModule mailModule = new MailModule();
        Injector injector = Guice.createInjector(mailModule);
        MailConfig config = injector.getInstance(MailConfig.class);
        config.setHost("smtp.gmail.com");
        Mail mail = //??
        mail.send();
     }
}

修正したMailClientでオブジェクト config`を使用して MailImpl`のインスタンスを作成するにはどうすればよいですか? この方法でGuiceを使用する必要がありますか?

3 回答


3


AssistedInjectをご覧ください。 この問題に対処しているようです。


2


2つの解決策があります。1)ホストパラメータを含むguiceオブジェクトとしても構成をバインドします。 次に、メールを挿入するだけです。メインメソッドでは、メールにさらに依存関係があるという事実を無視できます。

2)送信ごとにメールを個別に構成する必要があります(受信者?)。 その後、選択肢はありませんが、MailFactoryを使用して自分で作成します。


0


MailModuleのすべてを次のように実行できます。

public class MailModule extends AbstractModule {
    @Override
    protected void configure() {
       ... // other bindings
    }

    @Provides
    MailConfig getMailConfig( ... ) {
        MailConfig config = new MailConfig( ... );
        config.setHost("smtp.gmail.com");
        config;
    }
}

シングルトンMailConfigが必要な場合は、@ SingletonアノテーションをgetMailConfig()に追加します。ボブはあなたの叔父です。

getMailConfigの引数をバインドする必要があることに注意してください。 Stringのような一般的に使用される型をバインドするときは、必ずバインディングアノテーションを追加してください。