私は自分のプロジェクトで DI にすばらしいSwinjectを使用していますが、アセンブリなしで使用しています (Swinject を使い始めた時点では、アセンブリはありませんでした)。
私の現在の使用パターンContainers
は次のとおりです。
class ParentContainer {
private let container: Container
init(parentContainer: Container?) {
container = Container(parent: parentContainer)
container.register....
}
func myTopLevelController() -> MyTopController {
let controller = container.resolve....
controller.container = self // controller holds its container
return controller
}
func childContainer() -> ChildContainer {
return ChildContainer(parentContainer: container)
}
}
class ChildContainer {
private let container: Container
init(parentContainer: Container?) {
....
}
その構成では:
- コンテナは存続する必要がある限り存続します (コンテナへの参照を保持する唯一のエンティティ - 依存関係を使用できる VC)
- 私のコードが呼び出すように、DI フレームワークの使用を停止/切り替えて、手動ビルドに置き換えること
Container
もできます (私のコードはフレームワークについて認識していません)。let topController = ParentContainer().myTopLevelController()
今、私は適用しようとしていますAssembly
。私が理解できる限り、私のコンテナーはAssemblyType
プロトコルに準拠するようになりました。しかし、私はいくつかの混乱があります:
- コンテナーではなく、アセンブリを介してインスタンスを解決する必要がありますか?
func loaded(resolver: ResolverType)
メソッドの目的は何ですか?リゾルバーを保持する必要がありますか? リテインサイクルにつながる?- TopLevelAssembly を使用したいのですが、リーフ エンティティには引き続き Containers を使用します。Assembly をコンテナの親として渡すことは可能ですか? または、それを達成する他の方法はありますか?