6

次のようなサードパーティ クラスがあるとします。

public class MyObject {
    @Inject
    public MyObject(Foo foo, Bar bar) { ... }
}

ここで、次のようなファクトリ インターフェイスがあるとします。

public interface MyObjectFactory {
    public MyObject build(Bar bar);
}

アイデアは、固定のMyObjectFactoryを構築するが必要だということです。つまり、基本的にコンストラクターパラメーターの注釈を外部から追加します。もちろん、手動で実装することは常に可能です。MyObjectFoo@AssistedBarMyObjectFactory

public class MyObjectFactoryImpl implements MyObjectFactory {
    @Inject private Provider<Foo> foo;

    @Override
    public MyObject build(Bar bar) { return new MyObject(foo.get(), bar); }
}

しかし、Guice でインスタンスをビルドする必要がある条件があるとしましょうMyObject(メソッド インターセプターなど)。これは「インジェクターを注入する」ための仕事のようです:

public class MyObjectFactoryImpl implements MyObjectFactory {
    @Inject private Injector injector;

    @Override
    public MyObject build(Bar bar) {
        Injector child = injector.createChildInjector(new AbstractModule() {
            @Override
            protected void configure() {
                bind(Bar.class).toInstance(bar);
                // Set up method interceptors for MyObject here...
            }
        });
        return child.getInstance(MyObject.class);
    }
}

これは邪悪でボイラープレートのように聞こえるので、代わりの実装や Guice にファクトリ impl を生成させる方法があるかどうか疑問に思っています。

4

2 に答える 2

-1

実際そうです。アシストインジェクションをご覧ください

含む

        <dependency>
            <groupId>com.google.inject.extensions</groupId>
            <artifactId>guice-assistedinject</artifactId>
            <version>${guice.version}</version>
        </dependency>

アシスト付き更新インジェクション

public class MyInjectedObject extends MyObject implements MyIntf {
@Inject
public MyObject(Foo foo, @Assisted Bar bar) { super(foo,bar); }
}

もう 1 つのインターフェイスを追加する必要があります。

public interface MyIntf {}

モジュールでジェネリック ファクトリをインターフェイスにバインドします

    install(new FactoryModuleBuilder()
            .implement(MyIntf.class, MyInjectedObject.class)
            .build(MyObjectFactory.class)
);

好きな場所に注入MyObjectFactoryできるようになりました。

MyObject obj = myObjectFactory.build(bar);
于 2015-06-26T07:43:11.077 に答える