ServiceLocatorを追加して、Page生成のDependency Injection対応が可能となりました。
KAMISHIBAIをPrismと併用する記事を書かなきゃなと思っていたら、神のようなタイミングで記事化してくださった方がいらっしゃいまして。
かずきさん、ありがとうございました!
その中で2点、ご指摘いただきました。
- Pageがデフォルトコンストラクタの存在が前提となっておりDIContainerからの生成に対応していない
- Prismと比較するとDeepLinkサポートがない
どちらも仰る通りで、1.はすぐ対応できることなので、対応してリリースしました。
例えば、Prism.Autofac.Formsを利用される場合、App.csに次のように記述することでPage生成をDI Containerへ移譲することが可能になります。
public partial class App : PrismApplication { public App(IPlatformInitializer initializer = null) : base(initializer) { } protected override void OnInitialized() { InitializeComponent(); ServiceLocator.SetLocator(type => Container.Resolve(type)); ApplicationService.Initialize(this); ApplicationService.SetMainPage(new NavigationPage(new MainPage()), "Hello from Xamarin.Forms"); } protected override void RegisterTypes() { var builder = new ContainerBuilder(); builder.RegisterType<MainPage>(); builder.RegisterType<SecondPage>(); builder.Update(Container); } }
ServiceLocator.SetLocatorで、Containerから生成するようにデリゲートを渡してあげればOKです。
あと、ContainerへのType登録ですが、RegisterTypeForNavigationではなく、ContainerBuilderを利用してRegisterTypeで行っています。
RegisterTypeForNavigationはPrismのNavigationServiceを利用するための拡張メソッドですので。
ちなみにServiceLocatorの名前がPageResolverとかじゃないのは理由があります。今度ViewModeLocatorを作ってDIと仲良くする方法を記事化しますがそこでも利用したいためです。
なお、Prismとの併用サンプルを一応こちらのリポジトリに「LiveWithPrism」というプロジェクトで作成してありますので、よかったらご覧ください。
なお、DeepLinkについてですが、ちょっと考えがあって現時点ではKAMISHIBAIではサポートしていませんが、不可能なわけではありません。
URIベースの指定は無理ですけどね。
その辺は、書き出すと長くなるのでまた今度きちんと文書化しようと思います。
というわけで、今日はここまで!