グラフ内のオブジェクトのライフサイクルの作成と管理を担当する手作りのコンテナー/インジェクターを使用する場合、次のパターンを使用します (ObjC での DIY DI に関する記事を読みました)。
別のビュー コントローラー (詳細ビュー コントローラーと呼びましょう) を表示したいルート ビュー コントローラーがあり、データを渡しているとします。私が通常行うことは、データを引数として受け取り、表示する新しいビュー コントローラーを返すプロバイダー ブロックを挿入することです。ここにいくつかのコードがあります...
@implementation RootViewController
{
UIViewController (^detailViewControllerProvider)(SomeData *someData);
}
- (id) initWithDetailViewControllerProvider:(UIViewController (^)(SomeData *someData))detailViewControllerProvider
{
//...
_detailViewControllerProvider = detailViewControllerProvider;
//...
}
// ...
- (void) presentDetailViewControllerWithData:(SomeData *)someData
{
UIViewController *detailViewController = _detailViewControllerProvider(someData);
[self presentViewController:detailViewController animated:YES completion:nil];
}
@end
ファクトリ クラスを使用することもできますが、この方法では、コンテナー クラスにプロバイダー ブロックを作成するだけで新しいクラスを作成することを回避できます。
問題は、Typhoon を DI コンテナーとして使用したい場合です。どうすれば同じパターンを使用できますか? 私の詳細ビューコントローラーでは、他のものを注入しています。コンストラクター注入を引き続き使用したいので、私ではなくコンポーネントファクトリによって作成されることを好みます。詳細 VC を作成するためのファクトリ クラスを作成し、後で詳細 VC に注入する依存関係を (ファクトリ) に注入することもできますが、ブロック ベースのソリューションと比較すると、作業が多すぎるようです。
ルート ビュー コントローラーからコンポーネント ファクトリにアクセスしたくありません。また、someData のセッター インジェクションも使用しません。
これに対する解決策はありますか?