を処理する方法にまで読むことができる、ここでGuiceのは(Java用DIフレームワーク)を使用しています何:
の場合Foo
の注入要求があるたびに異なるオブジェクトが必要な場合は、アプリケーションを配線するときにFoo.class
を特定のインスタンスFoo
にバインドせず、必要に応じてFoo
を作成するオブジェクトであるProvider<Foo>
をバインドします。そして、Foo
が注入された場所はすべて新しいインスタンスを取得します。たとえば、Foo
インスタンスの代わりにFoo
をクラスにバインドするだけの場合(Foo
がインターフェイスで、Foo
を実装するクラスであるRealFoo.class
にバインドした場合)、同じ効果が得られます。毎回新しいインスタンスが作成されます。 Foo
の2つのインスタンスが必要な場合は、アプリケーションを配線してから、アプリケーションを配線するときに構成する必要があります(これはデフォルトの「スコープなし」の動作です)。 "このFooのインスタンスは、Bumble
を作成するときに使用されるのに対して、Baz
の場合はまたはBaz
を作成するときに使用されます。"と言うと、注入ポイントに注釈を付けてから、アプリケーションを配線するときは
Foo foo1 = new Foo("1");
Foo foo2 = new Foo("2");
bind(Foo.class).annotatedWith(Names.named("Bar")).toInstance(foo1);
bind(Foo.class).annotatedWith(Names.named("Baz")).toInstance(foo1);
bind(Foo.class).annotatedWith(Names.named("Bumble")).toInstance(foo2);
ここでは、引数をBar
のconstrucに注釈したと仮定しますBaz
とBumble
ため
public Bar(@Named("Bar") Foo foo) { ...
と同様:ようなものでTOR。もちろん、Bar
とBaz
というコンストラクタに同じものをアノテーションする場合は、bind
のいずれかの行をスキップできます。
私は、リフレクションに基づいたPHP用のアノテーション処理フレームワークがあることを知っています。あるいは、おそらく引数名に基づいた規約を使用することができます。
"php"というタグは削除されました。これは実装言語の選択肢が本当に問題には関係ないからです。 – skaffman