6

工場を使用しているサンプルコードがいくつかあります。ファクトリを削除してコードをクリーンアップし、代わりに 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 でMailImplオブジェクトを使用してインスタンスを作成するにはどうすればよいですか? configこのように Guice を使用する必要がありますか?

4

3 に答える 3

3

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

于 2010-01-21T08:51:05.490 に答える
2

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

2) メールは、送信ごとに個別に構成する必要があります (受信者?)。その場合は仕方がありませんが、MailFactory を使用して自分で作成してください。

于 2010-01-21T00:48:04.990 に答える