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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
170
Xamarin.Forms 使うべき?
yukaabuno
3
1.2k
Other Decks in Technology
See All in Technology
GitHub Copilot app最速の発信の裏側
tomokusaba
1
190
マルチアカウント環境での コーディングエージェントを使った障害調査が大変なので AIエージェントにReadOnly権限を付与してみた / ReadOnly AI Agents for Multi-Account AWS Incident Response
yamaguchitk333
2
110
アンオフィシャルな、オフィシャルからのお願い
wyamazak_devrel
0
140
【NRUG vol.18】KubernetesにおけるNew Relicデータ取得量削減の考え方
nrug_member
0
170
【Snowflake Summit 2026 Recap!!】Snowflake Summit Deep Dive: Security & Governance
civitaspo
1
270
「勝手に広まる」人気 AI エージェントを爆速で作ろう!(AWS Summit Japan 2026講演資料)
minorun365
PRO
8
2k
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
260
フィジカル版Github Onshapeの紹介
shiba_8ro
0
290
LayerX コーポレートエンジニアリング室におけるサプライチェーンセキュリティへの取り組み / Supply Chain Security at LayerX Corporate Engineering
yuyatakeyama
2
680
データレイクの「見えない問題」を可視化する
sansantech
PRO
1
100
Lightning近況報告
kozy4324
0
190
AI駆動開発を通して感じた、 AI時代のデザイナーの役割変化
whisaiyo
4
2.3k
Featured
See All Featured
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
54k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
290
BBQ
matthewcrist
89
10k
The Curse of the Amulet
leimatthew05
1
13k
Faster Mobile Websites
deanohume
310
31k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
290
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Believing is Seeing
oripsolob
1
150
Rails Girls Zürich Keynote
gr2m
96
14k
Building the Perfect Custom Keyboard
takai
2
800
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プログラマにマルチプラットフォーム/マルチタイプ開発な環境を用意してくれて、 様々なプラットフォーム開発の知識やデザインパターンの勉強をさせてくれる凄い人た ちに
感謝っ・・・・! 圧倒的感謝っ・・・・!
ご清聴ありがとうございました。