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