Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Xamarin.Forms とコンソールアプリでモデル層を共通化してみた
Search
Yu_ka1984
March 11, 2017
Technology
2.2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Xamarin.Forms とコンソールアプリでモデル層を共通化してみた
Yu_ka1984
March 11, 2017
More Decks by Yu_ka1984
See All by Yu_ka1984
EventGridTopicで手軽にイベントドリブンを手に入れる
yukaabuno
5
1.8k
Durable Functionsを"公式ドキュメントとは違う形で"話して見る
yukaabuno
3
890
Durable Functionsの特徴をふわっと理解してみる
yukaabuno
2
180
Xamarin.Forms 使うべき?
yukaabuno
3
1.2k
Other Decks in Technology
See All in Technology
AI時代の強いチームの作り方
yuukiyo
25
16k
トヨタ⽣産⽅式(TPS)⼊⾨
recruitengineers
PRO
2
610
【CEDEC2026】次世代デジタルカードゲームのサーバー設計と運用 〜『Shadowverse: Worlds Beyond』の舞台裏~
cygames
PRO
1
950
Agent 時代の Kaggle 展望 / kaggle-in-the-agentic-era
upura
1
640
強化学習「理論」入門
enakai00
3
3.6k
【CEDEC2026】『GRANBLUE FANTASY: Relink - Endless Ragnarok』のバトル制作事例 ~最高のキャラゲーを目指して~
cygames
PRO
0
220
攻撃と防御で学ぶAI時代のプロダクトセキュリティ演習
recruitengineers
PRO
6
1.6k
もう一度考える SRE チームの作り方・育て方 / Rethinking SRE #1: Building and Growing SRE Teams
rrreeeyyy
6
1k
今こそ聞きたいソフトウェア設計 ドメイン駆動設計再入門
masuda220
PRO
17
6.4k
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
4
24k
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
140
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
Featured
See All Featured
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
440
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
The untapped power of vector embeddings
frankvandijk
2
1.8k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
New Earth Scene 8
popppiees
3
2.5k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
350
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
56k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
230
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
420
Transcript
Xamarin.Forms とコンソールアプリでモデル層 を共通化してみた まどすた #2 2017/03/11 Yuka Abuno
@yu_ka1984 Yuka Abuno http://tamafuyou.hatenablog.com/ シグマコンサルティング株式会社 アーキテクト になることが目標
初めてXamarin.Formsを使ったスマホアプリプロジェクトは WPFアプリをスマホで使えるようにするプロジェクトでした。 ほとんどコード共通化できなかった(´・ω・`)
.NET Frameworkで書けるクライアントアプリ 2010年当時 現在 ▪ コンソールアプリ ▪ Windows Forms (まだまだ現役!(^^)!)
▪ WPF ▪ UWP ▪ Xamarin Mac ▪ Xamarin Android ▪ Xamarin iOS ▪ Unity ▪ erc ▪ コンソールアプリ ▪ Windows Forms(当時も現役!(^^)!) ▪ WPF ▪ Mono Gtk# ▪ SilverLight
Xamarin開発だけでも Xamarin.Formsを使ってクロスプラットフォーム開発 UIも共通コードで爆速\(^o^)/ Xamarin Nativeで各プラットフォーム毎に Nativeと同じ実装方法で 最適なUIを目指して開発 一つのプロダクトでXFとXNの2タイプの開発を行うこともあり得る。
これからの.NETアプリ開発は マルチプラットフォーム開発を通り越して マルチタイプ開発が前提になる かもしれない・・・
C#のGUIアプリは Model – View – Whatever M V C P
VM M V M V
VM fat VM M V Model層にある関数をコールして 戻り値を受け取ってVMに反映 VMでロジックが書かれている VM fat
マルチタイプ what ever M V クライアントGUIタイプ コマンド CLIタイプ タイプが違っても共通化で きるのるはモデル層
• バックエンド • ハードウェアデバイス • インフラ
モデル層は入出力をつなげたら動く タイプに依存しないアプリケーションそのもの
アプリケーションそのものなモデル層は コンソールアプリでも使えるはず
簡単なチャットアプリを作ってみました。 http://websocketscaletest1.azurewebsites.net/ ASP.NET Core の WebSocketとスケールアウトを検証する ために作ったブラウザサンプルアプリ。 バックエンド -> •
Azure WebApps • ASP.NET Core • ASP.NET WebSocet Server • Azure ServiceBus フロントエンド-> • Vue.js (JavaScript MVVM フレームワーク) フロントエンドを コンソールアプリ Xamarin.Forms(Android/iOS) で作成 Xamarin.Forms とコンソールアプリでモデル層を共通化して
Visual Studio 2017 RC ChatSample クラスライブラリ(.NET Standard) App1 Xamarin.Forms (
Shared ) ConsoleApp1 コンソールアプリ(.NET Core) https://github.com/yuka1984/ChatXFSample
ChatServiceクラス 入力 非同期メソッド • LoadRoomsAsync • JoinRoomAasync • ExitRoomAsync •
SendMessageAsync 出力 • INotifyPropertyChanged(BindableBase) • INotifyCollectionChanged (ReadOnlyObservableCollection) • ErrorEventHandler 入力 状態変更通知
インスタンス管理 アプリケーションを構成するためのモデル層のインスタンスを提供する事はモ デル層の責務 コンテナーを使ってアプリに必要なモデル層のインスタンスをモデル層で構築 して引き出せるようにする。 Repositoryクラスやプラットフォーム依存となるようなクラスはInterfaceを 作成して差し替えられるようにする
Xamarin.Formsの場合 ▪ MVVM ▪ ViewModelクラスとViewクラスは基本的に1対1の関係(例外あり) ▪ ViewModelクラスとServiceクラスはN対Nの関係 ▪ ReactivePropertyを使用することでサービスクラスの変更通知に対する ViewModelのプロパティへの反映を行う
V M V M V M V V V S S S
ReactiveProperty モデル側の プロパティ VM側のプ ロパティ Rx public RoomModel SelectedRoom{ get
{ return selectedRoom; } private set { this.SetProperty(ref this.selectedRoom, value); } } public string UserName { get { return username; } private set { this.SetProperty(ref this.username, value); } } ReadOnlyReactiveProperty<string> Title = service.ObserveProperty(x => x.SelectedRoom).Select(x => x?.Name) .CombineLatest( service.ObserveProperty(x => x.UserName), (roomname, username) => $"{username} - {roomname}" ) .ToReadOnlyReactiveProperty();
コンソールアプリの場合 ▪ ごりごり実装してみました ▪ サービスクラスの変更通知はイベントで受信してコンソール出力へ反映
まとめ ▪ これからの.NETクライアント開発はマルチプラットフォームに加えてマルチタイプ開発を 意識すると良いかもしれない ▪ モデル層はアプリケーションそのもの ▪ .NETプログラマにマルチプラットフォーム/マルチタイプ開発な環境を用意してくれて、 様々なプラットフォーム開発の知識やデザインパターンの勉強をさせてくれる凄い人た ちに
感謝っ・・・・! 圧倒的感謝っ・・・・!
ご清聴ありがとうございました。