Xamarin の救世主 Unity !

27
Xamarin の救世主 Unity2014/12/06(土) わんくま勉強会 東京 #93 @matatabi-ux クロスプラットフォーム開発 × DI コンテナのすすめ ゲーム開発ツール じゃない方

Transcript of Xamarin の救世主 Unity !

Page 1: Xamarin の救世主 Unity !

Xamarin の救世主 Unity!

2014/12/06(土) わんくま勉強会 東京 #93

@matatabi-ux

クロスプラットフォーム開発 × DI コンテナのすすめ

ゲーム開発ツールじゃない方

Page 2: Xamarin の救世主 Unity !

お や く そ く掲載内容は個人の私見であり、

所属組織の見解ではありません

Page 3: Xamarin の救世主 Unity !

自己紹介: 黒柳 達士(@matatabi-ux)

• お仕事

⁃ 某第二工場で Windows ストアアプリ大量生産中

⁃ 拝承系 SIer → 安心簡単快適デザイン会社 → 現職

• 個人活動

⁃ Blog: 「しっぽを追いかけて」 http://matatabi-ux.hateblo.jp

⁃ facebook: https://www.facebook.com/tatsuj.kuroyanagi

⁃ 日本人間工学会 認定人間工学専門家 UX 語れます

⁃ 飼い猫写真も垂れ流し中

twitter: https://twitter.com/burst_cafemocha

facebook: https://www.facebook.com/burst.cafemocha

しっぽもふもふの自宅警備ネコ 「モカ」

Page 4: Xamarin の救世主 Unity !

今回の目標とおことわり

• 目標

⁃ Xamarin でも使える強力な DI コンテナ Unity のご紹介

⁃ Xamarin のクロスプラットフォーム開発で DI コンテナの活用方法を提案

• 注意事項

⁃ ゲーム開発ツールの Unity じゃありません!一緒にしないで!

⁃ Xamarin は現在進行形で進化中なので仕様が大きく変わるかも

⁃ XAML をある程度知っている C# エンジニア視点でまとめました

⁃ Xamarin で使える Unity はプレリリース版

Page 5: Xamarin の救世主 Unity !

おしながき

• DI コンテナ Unity の概要

• Xamarin プロジェクトへの Unity 導入

• Xamarin × インスタンスの解決

• Xamarin × 依存関係の注入

• まとめ

※ この発表資料は SlideShare で公開します

http://www.slideshare.net/tatsujkuroyanagi/xamarin-unity

Page 6: Xamarin の救世主 Unity !

Unity DI コンテナ Unity の概要

Page 7: Xamarin の救世主 Unity !

DI コンテナ Unity の概要

ビジネスアプリ開発用 「依存関係注入」 コンテナライブラリ

⁃ Microsoft patterns & practices チームが進めているプロジェクト成果物のひとつ

⁃ 軽量で柔軟性の高い DI コンテナとその実践パターンを提供

⁃ Dependency Injection:依存関係注入とは実行時に外部からオブジェクトの振る舞いを決定する機能

Inversion of Control:制御の反転を実現する有力な設計パターンのひとつ

Instance

Resolution

Life Time

Controll

Constructor

Injection

Property

Injection

Method

Injection

Page 8: Xamarin の救世主 Unity !

Service B

DI コンテナ Unity の概要

Service A

Client

Service B

DI Container

ClientService A Service

Interface

インスタンス生成サービス実装の解決

依存関係の注入

サービス利用

サービス利用

通常の設計(制御側がサービス実装に依存する) 依存関係注入の設計(サービス実装が制御側により決定される)

Inversion of Control:制御の反転を実現する 「依存関係の注入」

⁃ クライアントクラスからサービスクラスを利用する場合、クライアント側がサービス側の変更に影響を受けてしまう

⁃ サービスクラスは共通インタフェースを実装して内部実装を隠ぺいする

⁃ DI コンテナがクライアントインスタンスを生成しサービスクラスを渡すことで制御を反転させる

Page 9: Xamarin の救世主 Unity !

DI コンテナ Unity の概要

DI コンテナ「Unity」が Xamarin の救世主となるワケ

⁃ C# の Xamarin 対応 PCL として提供されている DI コンテナ

⁃ もちろんライセンス形態は iOS、Android に利用できる Apache 2.0 ライセンス

⁃ Xamarin では各プラットフォームごとの処理記述が冗長になりやすい

⁃ Xamarin では共通コードに各プラットフォームごとの分岐処理が入り込みやすい

Instance

Resolution

Life Time

Controll

Constructor

Injection

Property

Injection

Method

Injection

Page 10: Xamarin の救世主 Unity !

DI コンテナ Unity の概要

DI コンテナ「Unity」が Xamarin の救世主となるワケ

⁃ 冗長な処理記述 → 抽出したインタフェース実装で共通機能に集約される

⁃ 共通コードに分岐処理が入り込む → 分岐処理は DI コンテナが肩代わり

⁃ 共通処理と固有処理が整理され、クラス間の依存性が下がる

iOS

PCL / Shared

Windows

クラス間が密結合で、共通コードが各プラットフォームに依存 制御が反転し、共通コードがプラットフォーム依存から分離される

Android

iOS

PCL / Shared

Windows

Androidコード保守性

テスト容易性

開発生産性

コード保守性

テスト容易性

開発生産性

Page 11: Xamarin の救世主 Unity !

Xamarin×

Unity

Xamarin プロジェクトへの

Unity 導入

Page 12: Xamarin の救世主 Unity !

Xamarin プロジェクトへの Unity 導入

Shared プロジェクトの場合、共通

コードとプラットフォーム固有コードを

混在できるため

Xamarin プロジェクトの作成

⁃ Xamarin.Forms の PCL プロジェクトで作るのがおすすめ!

Page 13: Xamarin の救世主 Unity !

Xamarin プロジェクトへの Unity 導入

Unity パッケージのインストール

⁃ Visual Studio からソリューションを選び NuGet パッケージマネージャを開く

⁃ 検索対象を「リリース前のパッケージを含める」にする

⁃ 「Unity」 で検索して Unity 3.5.1405-prerelease 以降を選択してインストールする

忘れやすいので注意!

Visual Studio 2013 の場合 Visual Studio 2015 Preview の場合

Page 14: Xamarin の救世主 Unity !

DEMOXamarin プロジェクトへ

の Unity 導入

Page 15: Xamarin の救世主 Unity !

Xamarin×

Resolver

Xamarin × インスタンスの

解決

Page 16: Xamarin の救世主 Unity !

var container = new UnityContainer();

container.RegisterType<ITextSpeechService, TextSpeechService>(

null, // 同一型で区別される登録名称(省略可能)

new ContainerControlledLifetimeManager(), // インスタンスの生存管理方法(省略可能)

new InjectionMember[], // 注入する依存関係設定(省略可能)

);

var service = container.ResolveType<ITextSpeechService>();

Xamarin × インスタンスの解決

インタフェースとインスタンスの型を指定

Unity を利用したインスタンスの解決

⁃ 事前に RegisterType メソッドでクラスのインスタンス化時の振る舞いを登録

⁃ ResolveType メソッドで登録された内容に応じてインスタンスが取得できる

InjectionMember については後述

Page 17: Xamarin の救世主 Unity !

Xamarin × インスタンスの解決

指定できる LifetimeManager の種類

インスタンス共有範囲 インスタンスの生存期間

TransientLifetimeManager

※ 未指定時のデフォルト共有なし(解決時に毎回生成) 生成後はコンテナには保持されない

PerThreadLifetimeManager スレッド内で共有 明示的に破棄するまで(強い参照)

ExternallyControlledLifetime

Managerコンテナ内で共有

ガベージコレクションに回収されるまで

(弱い参照)

ContainerControlledLifetime

Managerコンテナ内で共有 明示的に破棄するまで(強い参照)

Page 18: Xamarin の救世主 Unity !

DEMOXamarin × インスタンス

の解決

※このデモのソースコードは GitHub で公開中

https://github.com/matatabi-ux/XamarinUnityResolution

Page 19: Xamarin の救世主 Unity !

Xamarin×

Injection

Xamarin × 依存関係の注入

Page 20: Xamarin の救世主 Unity !

Xamarin × 依存関係の注入

Unity で利用できる依存関係の注入機能(インスタンス生成時に注入)

⁃ コンストラクター注入 :Constructor Injection

利用するコンストラクタ、引数を変える ※引数に null は指定不可

既定で Unity で管理するクラスはインスタンス生成時にコンストラクター注入が自動で行われる

⁃ プロパティ注入 :Property Injection

生成されるインスタンスのプロパティ値を変える ※ 要 public Setter

⁃ メソッド呼び出し注入 :Method Call Injection

呼び出されるメソッド、引数を変えるコンストラクタ、プロパティで指定できないprivate なメンバーの初期化には、メソッド呼び出しの注入を利用するにゃ!

Page 21: Xamarin の救世主 Unity !

Xamarin × 依存関係の注入

Unity の依存関係の注入の構成手法

構成の方法 主な特徴

構成ファイル

※今回は詳しい説明割愛

app.config ファイルで依存関

係を指定

構成ごとの柔軟な設定が簡単

コードによって追えない

残念ながら Xamarin では利用不可

実行時に指定初期化処理コードの中で、コードにより指定

コードの初期化子で柔軟な指定が可能インテリセンス、コードによる追跡ができる

属性付与による宣言インスタンス化するサービス

クラスに属性を付与して宣言

静的な指定だがコード自動生成と相性がいい

インテリセンス、コードによる追跡ができる

サービスクラスを見ることで依存関係が見える

Page 22: Xamarin の救世主 Unity !

コンストラクター注入

⁃ 実行時の基本的な指定方法

⁃ 属性での宣言方法

new InjectionConstructor(typeof(ITextSpeechService), “Speech Message”)

Xamarin × 依存関係の注入

型か名称で、注入するパラメータのインスタンスを指定

[InjectionConstructor]

public PageViewModel(

ITextSpeechService textService,

[Dependency(“Speech Message”)] string message)

InjectionConstructor の属性が優先されて利用される指定がなかった場合は一番パラメータ数が多いものが優先

属性を省略した場合は型での解決、指定した場合は名称で解決されます

Page 23: Xamarin の救世主 Unity !

プロパティ注入

⁃ 実行時の基本的な指定方法

⁃ 属性での宣言方法

new InjectionProperty(“Text Service”), new InjectionProperty(“Message”, “Speech Message”),

new InjectionProperty(“Logger”, new ResolvedParameter(typeof(ILogger), “FileLogger"))

Xamarin × 依存関係の注入

[Dependency]

public ITextSpeechService TextService { get; set; }

[Dependency(“Speech Message”)]

public string Message { get; set; }

引数を省略した場合は型での解決、指定した場合は型&名称で解決される

引数を省略した場合は型での解決、指定した場合は名称で解決される

ResolvedParameter を指定することで型と名称の組み合わせで解決することも

Page 24: Xamarin の救世主 Unity !

メソッド呼び出し注入

⁃ 実行時の基本的な指定方法

⁃ 属性での宣言方法

new InjectionMethod(“Initialize”, typeof(ITextSpeechService), “Speech Message”,

new ResolvedParameter(typeof(ILogger), “FileLogger"))

Xamarin × 依存関係の注入

型か名称で、注入するパラメータのインスタンスを指定

[InjectionMethod]

public void Initialize(

ITextSpeechService textService,

[Dependency(“Speech Message”)] string message)

InjectionMethod の属性が優先されて利用される

属性を省略した場合は型での解決、指定した場合は名称で解決されます

ResolvedParameter を指定することで型と名称の組み合わせで解決することも

Page 25: Xamarin の救世主 Unity !

DEMO Xamarin × 依存関係の注入

※このデモのソースコードは GitHub で公開中

https://github.com/matatabi-ux/XamarinUnityInjection

Page 26: Xamarin の救世主 Unity !

まとめ

• Xamarin でこそ Unity を使うべき!

⁃ クロスプラットフォーム開発はプラットフォーム固有処理が冗長でクラス間が密結合になりがち

⁃ DI コンテナを利用することで、影響範囲を狭めた改修とテストしやすい実装ができる

⁃ Xamarin で利用する DI コンテナは Unity がおすすめ!

• インスタンスの解決と依存関係の注入を使いこなそう

⁃ インスタンス解決と共有範囲と生存期間を設定できる

⁃ 利用できる注入の種類は、コンストラクタ、プロパティ、呼び出しメソッドの 3 種類

⁃ 注入構成の方法は、構成ファイル、実行時の指定、属性による宣言の 3 種類

iOS

PCL / Shared

Windows

Android

Page 27: Xamarin の救世主 Unity !

参考情報

• Microsoft patterns & practices - Unity プロジェクトページ

https://unity.codeplex.com/

• Unity 3 MSDN(英語)

http://msdn.microsoft.com/ja-jp/library/dn170416.aspx

• @IT – 新しいオブジェクト生成機構で EntLib はこう変わる!

http://www.atmarkit.co.jp/fdotnet/entlib/entlibv4/entlibv4_02.html

Instance

Resolution

Life Time

Controll

Constructor

Injection

Property

Injection

Method

Injection