Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Xamarin の救世主 Unity !

2,848 views

Published on

Xamarin の救世主 Unity!
クロスプラットフォーム開発 × DI コンテナのすすめ

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

Published in: Technology
  • Be the first to comment

Xamarin の救世主 Unity !

  1. 1. Xamarin の救世主 Unity! 2014/12/06(土) わんくま勉強会 東京 #93 @matatabi-ux クロスプラットフォーム開発 × DI コンテナのすすめ ゲーム開発ツール じゃない方
  2. 2. お や く そ く 掲載内容は個人の私見であり、 所属組織の見解ではありません
  3. 3. 自己紹介: 黒柳 達士(@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 しっぽもふもふの自宅警備ネコ 「モカ」
  4. 4. 今回の目標とおことわり • 目標 ⁃ Xamarin でも使える強力な DI コンテナ Unity のご紹介 ⁃ Xamarin のクロスプラットフォーム開発で DI コンテナの活用方法を提案 • 注意事項 ⁃ ゲーム開発ツールの Unity じゃありません!一緒にしないで! ⁃ Xamarin は現在進行形で進化中なので仕様が大きく変わるかも ⁃ XAML をある程度知っている C# エンジニア視点でまとめました ⁃ Xamarin で使える Unity はプレリリース版
  5. 5. おしながき • DI コンテナ Unity の概要 • Xamarin プロジェクトへの Unity 導入 • Xamarin × インスタンスの解決 • Xamarin × 依存関係の注入 • まとめ ※ この発表資料は SlideShare で公開します http://www.slideshare.net/tatsujkuroyanagi/xamarin-unity
  6. 6. Unity DI コンテナ Unity の概要
  7. 7. DI コンテナ Unity の概要 ビジネスアプリ開発用 「依存関係注入」 コンテナライブラリ ⁃ Microsoft patterns & practices チームが進めているプロジェクト成果物のひとつ ⁃ 軽量で柔軟性の高い DI コンテナとその実践パターンを提供 ⁃ Dependency Injection:依存関係注入とは実行時に外部からオブジェクトの振る舞いを決定する機能 Inversion of Control:制御の反転を 実現する有力な設計パターンのひとつ Instance Resolution Life Time Controll Constructor Injection Property Injection Method Injection
  8. 8. Service B DI コンテナ Unity の概要 Service A Client Service B DI Container Client Service A Service Interface インスタンス生成サービス実装の解決 依存関係の注入 サービス利用 サービス利用 通常の設計(制御側がサービス実装に依存する) 依存関係注入の設計(サービス実装が制御側により決定される) Inversion of Control:制御の反転を実現する 「依存関係の注入」 ⁃ クライアントクラスからサービスクラスを利用する場合、クライアント側がサービス側の変更に影響を受けてしまう ⁃ サービスクラスは共通インタフェースを実装して内部実装を隠ぺいする ⁃ DI コンテナがクライアントインスタンスを生成しサービスクラスを渡すことで制御を反転させる
  9. 9. 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
  10. 10. DI コンテナ Unity の概要 DI コンテナ「Unity」が Xamarin の救世主となるワケ ⁃ 冗長な処理記述 → 抽出したインタフェース実装で共通機能に集約される ⁃ 共通コードに分岐処理が入り込む → 分岐処理は DI コンテナが肩代わり ⁃ 共通処理と固有処理が整理され、クラス間の依存性が下がる iOS PCL / Shared Windows クラス間が密結合で、共通コードが各プラットフォームに依存 制御が反転し、共通コードがプラットフォーム依存から分離される Android iOS PCL / Shared Windows Androidコード 保守性 テスト 容易性 開発 生産性 コード 保守性 テスト 容易性 開発 生産性
  11. 11. Xamarin × Unity Xamarin プロジェクトへの Unity 導入
  12. 12. Xamarin プロジェクトへの Unity 導入 Shared プロジェクトの場合、共通 コードとプラットフォーム固有コードを 混在できるため Xamarin プロジェクトの作成 ⁃ Xamarin.Forms の PCL プロジェクトで作るのがおすすめ!
  13. 13. Xamarin プロジェクトへの Unity 導入 Unity パッケージのインストール ⁃ Visual Studio からソリューションを選び NuGet パッケージマネージャを開く ⁃ 検索対象を「リリース前のパッケージを含める」にする ⁃ 「Unity」 で検索して Unity 3.5.1405-prerelease 以降を選択してインストールする 忘れやすいので注意! Visual Studio 2013 の場合 Visual Studio 2015 Preview の場合
  14. 14. DEMO Xamarin プロジェクトへ の Unity 導入
  15. 15. Xamarin × Resolver Xamarin × インスタンスの 解決
  16. 16. var container = new UnityContainer(); container.RegisterType<ITextSpeechService, TextSpeechService>( null, // 同一型で区別される登録名称(省略可能) new ContainerControlledLifetimeManager(), // インスタンスの生存管理方法(省略可能) new InjectionMember[], // 注入する依存関係設定(省略可能) ); var service = container.ResolveType<ITextSpeechService>(); Xamarin × インスタンスの解決 インタフェースとインスタンスの 型を指定 Unity を利用したインスタンスの解決 ⁃ 事前に RegisterType メソッドでクラスのインスタンス化時の振る舞いを登録 ⁃ ResolveType メソッドで登録された内容に応じてインスタンスが取得できる InjectionMember について は後述
  17. 17. Xamarin × インスタンスの解決 指定できる LifetimeManager の種類 インスタンス共有範囲 インスタンスの生存期間 TransientLifetimeManager ※ 未指定時のデフォルト 共有なし(解決時に毎回生成) 生成後はコンテナには保持されない PerThreadLifetimeManager スレッド内で共有 明示的に破棄するまで(強い参照) ExternallyControlledLifetime Manager コンテナ内で共有 ガベージコレクションに回収されるまで (弱い参照) ContainerControlledLifetime Manager コンテナ内で共有 明示的に破棄するまで(強い参照)
  18. 18. DEMO Xamarin × インスタンス の解決 ※このデモのソースコードは GitHub で公開中 https://github.com/matatabi-ux/XamarinUnityResolution
  19. 19. Xamarin × Injection Xamarin × 依存関係の注入
  20. 20. Xamarin × 依存関係の注入 Unity で利用できる依存関係の注入機能(インスタンス生成時に注入) ⁃ コンストラクター注入 :Constructor Injection 利用するコンストラクタ、引数を変える ※ 引数に null は指定不可 既定で Unity で管理するクラスはインスタンス生成時にコンストラクター注入が自動で行われる ⁃ プロパティ注入 :Property Injection 生成されるインスタンスのプロパティ値を変える ※ 要 public Setter ⁃ メソッド呼び出し注入 :Method Call Injection 呼び出されるメソッド、引数を変える コンストラクタ、プロパティで指定できない private なメンバーの初期化には、メソッド 呼び出しの注入を利用するにゃ!
  21. 21. Xamarin × 依存関係の注入 Unity の依存関係の注入の構成手法 構成の方法 主な特徴 構成ファイル ※今回は詳しい説明割愛 app.config ファイルで依存関 係を指定 構成ごとの柔軟な設定が簡単 コードによって追えない 残念ながら Xamarin では利用不可 実行時に指定 初期化処理コードの中で、 コードにより指定 コードの初期化子で柔軟な指定が可能 インテリセンス、コードによる追跡ができる 属性付与による宣言 インスタンス化するサービス クラスに属性を付与して宣言 静的な指定だがコード自動生成と相性がいい インテリセンス、コードによる追跡ができる サービスクラスを見ることで依存関係が見える
  22. 22. コンストラクター注入 ⁃ 実行時の基本的な指定方法 ⁃ 属性での宣言方法 new InjectionConstructor(typeof(ITextSpeechService), “Speech Message”) Xamarin × 依存関係の注入 型か名称で、注入するパラメータ のインスタンスを指定 [InjectionConstructor] public PageViewModel( ITextSpeechService textService, [Dependency(“Speech Message”)] string message) InjectionConstructor の属性が優先されて利用される 指定がなかった場合は一番パラメータ数が多いものが優先 属性を省略した場合は型での解決、 指定した場合は名称で解決されます
  23. 23. プロパティ注入 ⁃ 実行時の基本的な指定方法 ⁃ 属性での宣言方法 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 を指定することで型と 名称の組み合わせで解決することも
  24. 24. メソッド呼び出し注入 ⁃ 実行時の基本的な指定方法 ⁃ 属性での宣言方法 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 を指定することで型と 名称の組み合わせで解決することも
  25. 25. DEMO Xamarin × 依存関係の注入 ※このデモのソースコードは GitHub で公開中 https://github.com/matatabi-ux/XamarinUnityInjection
  26. 26. まとめ • Xamarin でこそ Unity を使うべき! ⁃ クロスプラットフォーム開発はプラットフォーム固有処理が冗長でクラス間が密結合になりがち ⁃ DI コンテナを利用することで、影響範囲を狭めた改修とテストしやすい実装ができる ⁃ Xamarin で利用する DI コンテナは Unity がおすすめ! • インスタンスの解決と依存関係の注入を使いこなそう ⁃ インスタンス解決と共有範囲と生存期間を設定できる ⁃ 利用できる注入の種類は、コンストラクタ、プロパティ、呼び出しメソッドの 3 種類 ⁃ 注入構成の方法は、構成ファイル、実行時の指定、属性による宣言の 3 種類 iOS PCL / Shared Windows Android
  27. 27. 参考情報 • 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

×