1

Fantom afIocがそれに慣れるために、IoC フレームワークを使用して非常に単純なアプリを作成しようとしています。私はこれを試しました...

using afIoc

class Main {
  Registry registry := IocService([AppModule#]).start.registry

  @Inject
  myPod::Version? version

  Void main() {
    echo("version is $version")
  }    
}

バージョンクラスは

const class Version {
  override Str toStr() {
    "0.0.1"
  }
}

AppModule は

using afIoc

class AppModule {
  static Void bind(ServiceBinder binder) {
    binder.bind(myPod::Version#)
  }
}

コンパイルされますが、印刷されますversion is null。Main クラスを再定義して問題を修正しました。

using afIoc

class Main {

  Registry registry := IocService([AppModule#]).start.registry

  Void main() {
    version := (myPod::Version) registry.serviceById("myPod::Version")
    echo("version is $version")
  }
}

しかし、afIoc レジストリのライフサイクルと、メイン クラスの最初のバージョンにバージョン サービスが挿入されない理由を理解したいと思います。誰か説明してくれませんか?

4

1 に答える 1

1

私は人々が他の IoC フレームワークについて同様の質問をするのを見てきました...それで、プログラムを実行すると何が起こるか見てみましょう:

using afIoc

class Main {  //................................................... 1
  Registry registry := IocService([AppModule#]).start.registry //.. 2

  @Inject
  myPod::Version? version //....................................... 3

  Void main() {
    echo("version is $version") //................................. 4
  }    
}
  1. Fantom はMainクラスをインスタンス化します。

  2. Fantom はregistryフィールドを作成し、それを の結果に割り当てIocService([AppModule#]).start.registryます。このステートメントは、IoC レジストリを構築して返すだけです。

  3. Fantom によってversionフィールドが作成され、デフォルトで に設定されnullます。

  4. Fantom は、でmain()ある を出力するメソッドを呼び出します。versionnull

上記のどこにも、クラスに干渉するよう IoC に依頼していないことに注意してください。MainIoC レジストリを新しく作成し、フィールドに設定しました。

IoC に値をクラスに注入させたい場合は、次のように要求する必要があります。

  Void main() {
    registry.injectIntoFields(this)

    echo("version is $version")  // --> version is 0.0.1
  }

または、IoC に の新しいインスタンスをインスタンス化するように依頼することもできますMain

registry.autobuild(Main#)

autobuild()を何度も呼び出すと、 の多くのインスタンスが作成されることに注意してくださいMain

IoC でMain(シングルトン) のインスタンスを 1 つだけ作成するには、それを でサービスとして定義し、orで発見したようにAppModule使用します。regsitry.serviceById()registry.dependencyByType()Version

于 2014-08-10T18:25:40.253 に答える