Prism 6.3から7.0にアップデートする


## はじめに

XamarinやPrismについて知らない人はこれらの記事を読んでください。

https://qiita.com/amay077/items/38ee79b3e3e88cf751b9
http://www.nuits.jp/entry/2016/08/11/160313

今回はPrism6.3から7.0にアップデートする方法について説明します。

VisualStudio 2017 For Mac のPrismのテンプレートは2018/05の時点でPrism6.3向けになっています。Prismの最新版は7.0です。

最新の環境に合わせるために、6.3のテンプレートから7.0にアップデートします。

## 手順

まずはVisualStudioからパッケージを最新にします。
そしてコンパイルすると...エラーができます。

Prismは6.3から7.0の更新で破壊的変更が行われています。
そのため、テンプレートのコードから変更が必要になります。

### App.xaml.cs

変更前

```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Practices.Unity;
using Prism.Unity;
using prismSample.Views;

namespace prismSample
{
    public partial class App : PrismApplication
    {
        public App(IPlatformInitializer initializer = null) : base(initializer) { }

        protected override void OnInitialized()
        {
            InitializeComponent();

            NavigationService.NavigateAsync("MainPage?title=Hello%20from%20Xamarin.Forms");
        }

        protected override void RegisterTypes()
        {
            Container.RegisterTypeForNavigation<MainPage>();
        }
    }
}
```

変更後

```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Prism.Unity;
using prismSample.Views;
using Prism;
using Prism.Ioc;

namespace prismSample
{
    public partial class App : PrismApplication
    {
        public App(IPlatformInitializer initializer = null) : base(initializer) { }

        protected override void OnInitialized()
        {
            InitializeComponent();

            NavigationService.NavigateAsync("MainPage?title=Hello%20from%20Xamarin.Forms");
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<MainPage>();
        }
    }
}

```

名前空間が消えたり変わったりしたのでusingを変更します。

```
using Microsoft.Practices.Unity;
```
を消して

```
using Prism;
using Prism.Ioc;
```
を追加しました。

RegisterTypesの引数や使い方が変わったので全面的に書き換えました。

### AppDelegate.cs

```
using System;
using System.Collections.Generic;
using System.Linq;

using Foundation;
using UIKit;

using Prism.Unity;
using Prism;
using Prism.Ioc;

namespace prismSample.iOS
{
    // The UIApplicationDelegate for the application. This class is responsible for launching the 
    // User Interface of the application, as well as listening (and optionally responding) to 
    // application events from iOS.
    [Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        //
        // This method is invoked when the application has loaded and is ready to run. In this 
        // method you should instantiate the window, load the UI into it and then make the window
        // visible.
        //
        // You have 17 seconds to return from this method, or iOS will terminate your application.
        //
        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            global::Xamarin.Forms.Forms.Init();

            LoadApplication(new App(new iOSInitializer()));

            return base.FinishedLaunching(app, options);
        }
    }

    public class iOSInitializer : IPlatformInitializer
    {
        public void RegisterTypes(IContainerRegistry container)
        {

        }
    }
}

```

先ほどと同じようにusingとRegisterTypesを書き換えました。

### MainActivity.cs

```
using System;

using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

using Prism.Unity;
using Prism;
using Prism.Ioc;

namespace prismSample.Droid
{
    [Activity(Label = "prismSample.Droid", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);

            LoadApplication(new App(new AndroidInitializer()));
        }
    }

    public class AndroidInitializer : IPlatformInitializer
    {
        public void RegisterTypes(IContainerRegistry container)
        {

        }
    }
}

```

先ほどと同じようにusingとRegisterTypesを書き換えました。

## Androidでうまく行かない場合

生成されたJavaのコードで上手く動かないことがあります。
そういう時はリビルドすると治る場合があります。

## 最後に

次はPrismの使い方について説明していきます。