SlideShare a Scribd company logo
1 of 27
.NET Core Options pattern
ASP.NET Core Options patternと同様に関心ごとで階層化された情報をカプセル
化する
.NET Core Options Patternの構築手順
App.xaml.cs
•コンストラクタ
•Options Patternを定義したコンフィ
ギュレーションサービスを構築
•Options Pattern適用済みコンフィ
ギュレーションサービスを登録
App.xaml
•StartupUriを削除
•Startupメソッドを定義
•App.xaml.cs
•MainWindowをサービス登録
•StartupメソッドでMainWindowを呼
び出す
MainWindow.xaml.cs
•コンストラクタ
•クラススコープの変数にコンフィ
ギュレーションサービスを格納
•コンフィギュレーションサービスの
言語を指定してデータコンテキスト
に設定
•サービスの設定値を利用
設定サービス登録 スタートアップ方法変更 各画面で利用
ASP.NET Core Options Pattern recap
汎用ホストによるビジネスロジックとシステムロジックの分離
ASP.NET Core Options Pattern recap
xxController.cs
コンストラクタ
(サービス取
得)
(クラス・ス
コープの変数に
格納)
xxController.cs
各メソッド
(変数を利用)
JSONファイル
Program.cs
サービス登録
ASP.NET Core Options Pattern recap
xxController.cs
コンストラクタ
(サービス取
得)
(クラス・ス
コープの変数に
格納)
xxController.cs
各メソッド
(変数を利用)
JSONファイル
Program.cs
サービス登録
ASP.NET Core Options Pattern recap
xxController.cs
コンストラクタ
(サービス取
得)
(クラス・ス
コープの変数に
格納)
xxController.cs
各メソッド
(変数を利用)
JSONファイル
Program.cs
サービス登録
ASP.NET Core Options Pattern recap
xxController.cs
コンストラクタ
(サービス取
得)
(クラス・ス
コープの変数に
格納)
xxController.cs
各メソッド
(変数を利用)
JSONファイル
Program.cs
サービス登録
ASP.NET Core Options Pattern recap
xxController.cs
コンストラクタ
(サービス取
得)
(クラス・ス
コープの変数に
格納)
xxController.cs
各メソッド
(変数を利用)
JSONファイル
Program.cs
サービス登録
ASP.NET Core Options Pattern recap
xxController.cs
コンストラクタ
(サービス取
得)
(クラス・ス
コープの変数に
格納)
xxController.cs
各メソッド
(変数を利用)
JSONファイル
Program.cs
サービス登録
.NET Core Options Pattern for WPF
サービスの構築と登録
.NET Core Options Pattern for WPF
Program.cs
サービス登録
xxController.cs
コンストラクタ
(サービス取
得)
(クラス・ス
コープの変数に
格納)
xxController.cs
各メソッド
(変数を利用)
JSONファイル
.NET Core Options Pattern for WPF
Program.cs
サービス登録
xxController.cs
コンストラクタ
(サービス取
得)
(クラス・ス
コープの変数に
格納)
xxController.cs
各メソッド
(変数を利用)
JSONファイル
App.xaml.cs
コンストラクタ
(サービス構築)
(サービス登録)
MainWindow.xaml.cs
コンストラクタ
(サービス取得)
(クラス・スコープ
の変数に格納)
MainWindow.xaml.cs
各メソッド
(変数を利用)
JSONファイル
.NET Core Options Pattern for WPF
Program.cs
サービス登録
xxController.cs
コンストラクタ
(サービス取
得)
(クラス・ス
コープの変数に
格納)
xxController.cs
各メソッド
(変数を利用)
JSONファイル
App.xaml.cs
コンストラクタ
(サービス構築)
(サービス登録)
MainWindow.xaml.cs
コンストラクタ
(サービス取得)
(クラス・スコープ
の変数に格納)
MainWindow.xaml.cs
各メソッド
(変数を利用)
JSONファイル
Customize startup flow
MainWindowの表示までの流れをカスタマイズする
プロジェクトの作成
Extentionsのインストール
MainWindow表示までの流れ
App.xaml
(Startupメソッドに遷移)
App.xaml.cs
コンストラクタ
(MainWindowサービス登録)
Startupメソッド
( MainWindowサービス取
得)
(サービスを画面表示)
MainWindow.xaml.cs
コンストラクタ
(サービス取得)
(クラス・スコープの変数に
格納)
MainWindow.xaml.cs
各メソッド
(変数を利用)
JSONファイル
MainWindow表示までの流れ
App.xaml
(Startupメソッドに遷移)
App.xaml.cs
コンストラクタ
(MainWindowサービス登録)
Startupメソッド
( MainWindowサービス取
得)
(サービスを画面表示)
MainWindow.xaml.cs
コンストラクタ
(サービス取得)
(クラス・スコープの変数に
格納)
MainWindow.xaml.cs
各メソッド
(変数を利用)
JSONファイル
MainWindow.xaml.cs
コンストラクタ
(サービス取得)
(クラス・スコープの変数に
格納)
サービスのスコープ
App.xaml
(Startupメソッドに遷移)
App.xaml.cs
コンストラクタ
(MainWindowサービス登録)
Startupメソッド
( MainWindowサービス取
得)
(サービスを画面表示)
MainWindow.xaml.cs
コンストラクタ
(サービス取得)
(クラス・スコープの変数に
格納)
MainWindow.xaml.cs
各メソッド
(変数を利用)
JSONファイル
Use Options Pattern
MainWindowで設定値を表示する
MainWindow.xaml.csのコンストラクタ
App.xaml
(Startupメソッドに遷移)
App.xaml.cs
コンストラクタ
(MainWindowサービス登録)
Startupメソッド
( MainWindowサービス取
得)
(サービスを画面表示)
MainWindow.xaml.cs
コンストラクタ
(サービス取得)
(クラス・スコープの変数に
格納)
MainWindow.xaml.cs
各メソッド
(変数を利用)
JSONファイル
MainWindow.xaml.csのコンストラクタ
App.xaml
(Startupメソッドに遷移)
App.xaml.cs
コンストラクタ
(MainWindowサービス登録)
Startupメソッド
( MainWindowサービス取
得)
(サービスを画面表示)
MainWindow.xaml.cs
コンストラクタ
(サービス取得)
(クラス・スコープの変数に
格納)
MainWindow.xaml.cs
各メソッド
(変数を利用)
JSONファイル
MainWindowのView Model
App.xaml
(Startupメソッドに遷移)
App.xaml.cs
コンストラクタ
(MainWindowサービス登録)
Startupメソッド
( MainWindowサービス取
得)
(サービスを画面表示)
MainWindow.xaml.cs
コンストラクタ
(サービス取得)
(クラス・スコープの変数に
格納)
MainWindow.xaml.cs
各メソッド
(変数を利用)
JSONファイル
MainWindowのView Model
App.xaml
(Startupメソッドに遷移)
App.xaml.cs
コンストラクタ
(MainWindowサービス登録)
Startupメソッド
( MainWindowサービス取
得)
(サービスを画面表示)
MainWindow.xaml.cs
コンストラクタ
(サービス取得)
(クラス・スコープの変数に
格納)
MainWindow.xaml.cs
各メソッド
(変数を利用)
JSONファイル
Conclusion
 Options Patternは、ASP.NET Coreでも.NET Coreでも同じように設定値のカプセル化と業務の関心ご
との分離を行う
 汎用ホストはWebアプリケーション、デスクトップネイティブアプリケーションの両方で使える
 .NETのOptions Patternでは構成プロバイダーとしてXMLファイル、INIファイルの選択も可能
 .NETのOptions Patternでは、汎用ホストを使う際に、アプリケーション構成の設定、アプリケー
ション構成のサービス設定、画面のサービス構成を行うことで画面に階層化された設計値を送り込
むことができる
 汎用ホストはDependency Injectionを使って、アプリケーションホストのサービス構成をカスタマ
イズすることができる
 汎用ホストのサービスコレクションは構成サービスを定義する際にTOptions型を指定できるので、
自作の任意のクラスを使った構成ファイルの階層設計が可能(汎用ホストのDI拡張メソッドが自作
クラスをIOptionでラップしてくれる)
 利用側(MainWindow)のコンストラクタでは、構成ファイルのセクションごとに自作クラスに
マップしてくれるので、業務の関心ごとで分離されたセクションは、他のセクションに影響なしに
変更を加えることができる
 利用側で自作クラスにマップするセクションを選べるので、UI側で設定値の変更を動的に反映しや
Reference
pixabay
https://pixabay.com/
nuget: Microsoft.Extensions.Hosting
https://www.nuget.org/packages/Microsoft.Extensions.Hosting/
nuget: Microsoft.Extensions.Configuration
https://www.nuget.org/packages/Microsoft.Extensions.Configuration/
nuget: Microsoft.Extensions.Configuration.Json
https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Json/
nuget: Microsoft.Extensions.Hosting.Abstractions
https://www.nuget.org/packages/Microsoft.Extensions.Hosting.Abstractions/
nuget: Microsoft.Extensions.DependencyInjection
https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection/
Microsoft Docs: .NET での汎用ホスト
https://docs.microsoft.com/ja-jp/dotnet/core/extensions/generic-host
Microsoft Docs: .NET デスクトップ SDK プロジェクトの MSBuild リファレンス
(EnableDefaultApplicationDefinition)
https://docs.microsoft.com/ja-jp/dotnet/core/project-sdk/msbuild-props-desktop
Reference
Microsoft Docs: .NET での依存関係の挿入 - サービス登録メソッド
https://docs.microsoft.com/ja-jp/dotnet/core/extensions/dependency-injection#service-registration-methods
Microsoft Docs: ASP.NET Core での依存関係の挿入- 有効期間と登録のオプション
https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-6.0#lifetime-and-registration-options
Microsoft Docs: .NET の構成プロバイダー
https://docs.microsoft.com/ja-jp/dotnet/core/extensions/configuration-providers

More Related Content

Similar to OptonsPatternDotNet.pptx

Net advantage 2012 volume2 最新情報 xaml プラットフォーム編
Net advantage 2012 volume2 最新情報 xaml プラットフォーム編Net advantage 2012 volume2 最新情報 xaml プラットフォーム編
Net advantage 2012 volume2 最新情報 xaml プラットフォーム編Daizen Ikehara
 
AWS Black Belt Techシリーズ AWS Service Catalog
AWS Black Belt Techシリーズ AWS Service CatalogAWS Black Belt Techシリーズ AWS Service Catalog
AWS Black Belt Techシリーズ AWS Service CatalogAmazon Web Services Japan
 
20211203 AWS Black Belt Online Seminar AWS re:Invent 2021アップデート速報
20211203 AWS Black Belt Online Seminar AWS re:Invent 2021アップデート速報20211203 AWS Black Belt Online Seminar AWS re:Invent 2021アップデート速報
20211203 AWS Black Belt Online Seminar AWS re:Invent 2021アップデート速報Amazon Web Services Japan
 
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 FallAmazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 FallShinpei Ohtani
 
AWS Black Belt Techシリーズ AWS CloudFormation
AWS Black Belt Techシリーズ  AWS CloudFormationAWS Black Belt Techシリーズ  AWS CloudFormation
AWS Black Belt Techシリーズ AWS CloudFormationAmazon Web Services Japan
 
Web アプリケーション パターンと .NET - CLR/H 88 回 ~雪まつりデイ!~ バージョン
Web アプリケーション パターンと .NET - CLR/H 88 回 ~雪まつりデイ!~ バージョンWeb アプリケーション パターンと .NET - CLR/H 88 回 ~雪まつりデイ!~ バージョン
Web アプリケーション パターンと .NET - CLR/H 88 回 ~雪まつりデイ!~ バージョンAkira Inoue
 
Azure Kubernetes Service Overview
Azure Kubernetes Service OverviewAzure Kubernetes Service Overview
Azure Kubernetes Service OverviewTakeshi Fukuhara
 
愛と涙のWordPress無理やりカスタマイズ事例集
愛と涙のWordPress無理やりカスタマイズ事例集愛と涙のWordPress無理やりカスタマイズ事例集
愛と涙のWordPress無理やりカスタマイズ事例集Hidekazu Ishikawa
 
AWS Black Belt Techシリーズ Amazon CloudWatch & Auto Scaling
AWS Black Belt Techシリーズ  Amazon CloudWatch & Auto ScalingAWS Black Belt Techシリーズ  Amazon CloudWatch & Auto Scaling
AWS Black Belt Techシリーズ Amazon CloudWatch & Auto ScalingAmazon Web Services Japan
 
What's New in the Elastic 8.5 Release
What's New in the Elastic 8.5 ReleaseWhat's New in the Elastic 8.5 Release
What's New in the Elastic 8.5 ReleaseShotaro Suzuki
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01Yusuke Ando
 
S15 コマンドラインおよび API による Microsoft Azure の管理
S15 コマンドラインおよび API による Microsoft Azure の管理S15 コマンドラインおよび API による Microsoft Azure の管理
S15 コマンドラインおよび API による Microsoft Azure の管理Microsoft Azure Japan
 
Cocoa Pro5
Cocoa Pro5Cocoa Pro5
Cocoa Pro5hasegawa
 
2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料OCHI Shuji
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Akira Inoue
 

Similar to OptonsPatternDotNet.pptx (20)

Net advantage 2012 volume2 最新情報 xaml プラットフォーム編
Net advantage 2012 volume2 最新情報 xaml プラットフォーム編Net advantage 2012 volume2 最新情報 xaml プラットフォーム編
Net advantage 2012 volume2 最新情報 xaml プラットフォーム編
 
AWS Black Belt Techシリーズ AWS Service Catalog
AWS Black Belt Techシリーズ AWS Service CatalogAWS Black Belt Techシリーズ AWS Service Catalog
AWS Black Belt Techシリーズ AWS Service Catalog
 
20211203 AWS Black Belt Online Seminar AWS re:Invent 2021アップデート速報
20211203 AWS Black Belt Online Seminar AWS re:Invent 2021アップデート速報20211203 AWS Black Belt Online Seminar AWS re:Invent 2021アップデート速報
20211203 AWS Black Belt Online Seminar AWS re:Invent 2021アップデート速報
 
20170621 aws-black belt-ads-sms
20170621 aws-black belt-ads-sms20170621 aws-black belt-ads-sms
20170621 aws-black belt-ads-sms
 
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 FallAmazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
 
ASP.NET Core 概要(2017年3月時点)
ASP.NET Core 概要(2017年3月時点)ASP.NET Core 概要(2017年3月時点)
ASP.NET Core 概要(2017年3月時点)
 
AWS Black Belt Techシリーズ AWS CloudFormation
AWS Black Belt Techシリーズ  AWS CloudFormationAWS Black Belt Techシリーズ  AWS CloudFormation
AWS Black Belt Techシリーズ AWS CloudFormation
 
20090606
2009060620090606
20090606
 
20050903
2005090320050903
20050903
 
Web アプリケーション パターンと .NET - CLR/H 88 回 ~雪まつりデイ!~ バージョン
Web アプリケーション パターンと .NET - CLR/H 88 回 ~雪まつりデイ!~ バージョンWeb アプリケーション パターンと .NET - CLR/H 88 回 ~雪まつりデイ!~ バージョン
Web アプリケーション パターンと .NET - CLR/H 88 回 ~雪まつりデイ!~ バージョン
 
Azure Kubernetes Service Overview
Azure Kubernetes Service OverviewAzure Kubernetes Service Overview
Azure Kubernetes Service Overview
 
愛と涙のWordPress無理やりカスタマイズ事例集
愛と涙のWordPress無理やりカスタマイズ事例集愛と涙のWordPress無理やりカスタマイズ事例集
愛と涙のWordPress無理やりカスタマイズ事例集
 
AWS Black Belt Techシリーズ Amazon CloudWatch & Auto Scaling
AWS Black Belt Techシリーズ  Amazon CloudWatch & Auto ScalingAWS Black Belt Techシリーズ  Amazon CloudWatch & Auto Scaling
AWS Black Belt Techシリーズ Amazon CloudWatch & Auto Scaling
 
What's New in the Elastic 8.5 Release
What's New in the Elastic 8.5 ReleaseWhat's New in the Elastic 8.5 Release
What's New in the Elastic 8.5 Release
 
Windows Azure Programming
Windows Azure ProgrammingWindows Azure Programming
Windows Azure Programming
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
 
S15 コマンドラインおよび API による Microsoft Azure の管理
S15 コマンドラインおよび API による Microsoft Azure の管理S15 コマンドラインおよび API による Microsoft Azure の管理
S15 コマンドラインおよび API による Microsoft Azure の管理
 
Cocoa Pro5
Cocoa Pro5Cocoa Pro5
Cocoa Pro5
 
2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
 

More from Takao Tetsuro

Small Language Model Local Launch on AI Tour Tokyo
Small Language Model Local Launch on AI Tour TokyoSmall Language Model Local Launch on AI Tour Tokyo
Small Language Model Local Launch on AI Tour TokyoTakao Tetsuro
 
local launch small language model of AI.
local launch small language model of AI.local launch small language model of AI.
local launch small language model of AI.Takao Tetsuro
 
Implementation Approach of Artifical Intelligence
Implementation Approach of Artifical IntelligenceImplementation Approach of Artifical Intelligence
Implementation Approach of Artifical IntelligenceTakao Tetsuro
 
MAUIGraphicsNamespace.pptx
MAUIGraphicsNamespace.pptxMAUIGraphicsNamespace.pptx
MAUIGraphicsNamespace.pptxTakao Tetsuro
 
Polyglot Persistence and Graph Schema
Polyglot Persistence and Graph SchemaPolyglot Persistence and Graph Schema
Polyglot Persistence and Graph SchemaTakao Tetsuro
 
ServiceMeshEndpointWithMinimalAPIPublish.pptx
ServiceMeshEndpointWithMinimalAPIPublish.pptxServiceMeshEndpointWithMinimalAPIPublish.pptx
ServiceMeshEndpointWithMinimalAPIPublish.pptxTakao Tetsuro
 
ASP.NETCoreOptionsPattern.pptx
ASP.NETCoreOptionsPattern.pptxASP.NETCoreOptionsPattern.pptx
ASP.NETCoreOptionsPattern.pptxTakao Tetsuro
 
Layout isfirstprocessofatomicdesign
Layout isfirstprocessofatomicdesignLayout isfirstprocessofatomicdesign
Layout isfirstprocessofatomicdesignTakao Tetsuro
 
Wasm blazor and wasi 2
Wasm blazor and wasi 2Wasm blazor and wasi 2
Wasm blazor and wasi 2Takao Tetsuro
 
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説Takao Tetsuro
 
Interoperability of webassembly with javascript
Interoperability of webassembly with javascriptInteroperability of webassembly with javascript
Interoperability of webassembly with javascriptTakao Tetsuro
 
Interactive connection2
Interactive connection2Interactive connection2
Interactive connection2Takao Tetsuro
 
Relationship betweenddd and mvc
Relationship betweenddd and mvcRelationship betweenddd and mvc
Relationship betweenddd and mvcTakao Tetsuro
 
M365VM_PowerFX_takao-matsumoto_matsui_kojima
M365VM_PowerFX_takao-matsumoto_matsui_kojimaM365VM_PowerFX_takao-matsumoto_matsui_kojima
M365VM_PowerFX_takao-matsumoto_matsui_kojimaTakao Tetsuro
 
OpenStreetMap and Mapbox
OpenStreetMap and MapboxOpenStreetMap and Mapbox
OpenStreetMap and MapboxTakao Tetsuro
 
Excel on OneDrive is not a file
Excel on OneDrive is not a fileExcel on OneDrive is not a file
Excel on OneDrive is not a fileTakao Tetsuro
 
Development toolsforteamdevelopment
Development toolsforteamdevelopmentDevelopment toolsforteamdevelopment
Development toolsforteamdevelopmentTakao Tetsuro
 
React Helmet navigates SPA
React Helmet navigates SPAReact Helmet navigates SPA
React Helmet navigates SPATakao Tetsuro
 

More from Takao Tetsuro (20)

Small Language Model Local Launch on AI Tour Tokyo
Small Language Model Local Launch on AI Tour TokyoSmall Language Model Local Launch on AI Tour Tokyo
Small Language Model Local Launch on AI Tour Tokyo
 
local launch small language model of AI.
local launch small language model of AI.local launch small language model of AI.
local launch small language model of AI.
 
Implementation Approach of Artifical Intelligence
Implementation Approach of Artifical IntelligenceImplementation Approach of Artifical Intelligence
Implementation Approach of Artifical Intelligence
 
MAUIGraphicsNamespace.pptx
MAUIGraphicsNamespace.pptxMAUIGraphicsNamespace.pptx
MAUIGraphicsNamespace.pptx
 
Polyglot Persistence and Graph Schema
Polyglot Persistence and Graph SchemaPolyglot Persistence and Graph Schema
Polyglot Persistence and Graph Schema
 
ServiceMeshEndpointWithMinimalAPIPublish.pptx
ServiceMeshEndpointWithMinimalAPIPublish.pptxServiceMeshEndpointWithMinimalAPIPublish.pptx
ServiceMeshEndpointWithMinimalAPIPublish.pptx
 
ASP.NETCoreOptionsPattern.pptx
ASP.NETCoreOptionsPattern.pptxASP.NETCoreOptionsPattern.pptx
ASP.NETCoreOptionsPattern.pptx
 
gRPCurlDotNet.pptx
gRPCurlDotNet.pptxgRPCurlDotNet.pptx
gRPCurlDotNet.pptx
 
Layout isfirstprocessofatomicdesign
Layout isfirstprocessofatomicdesignLayout isfirstprocessofatomicdesign
Layout isfirstprocessofatomicdesign
 
Wasm blazor and wasi 2
Wasm blazor and wasi 2Wasm blazor and wasi 2
Wasm blazor and wasi 2
 
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
 
Team development
Team developmentTeam development
Team development
 
Interoperability of webassembly with javascript
Interoperability of webassembly with javascriptInteroperability of webassembly with javascript
Interoperability of webassembly with javascript
 
Interactive connection2
Interactive connection2Interactive connection2
Interactive connection2
 
Relationship betweenddd and mvc
Relationship betweenddd and mvcRelationship betweenddd and mvc
Relationship betweenddd and mvc
 
M365VM_PowerFX_takao-matsumoto_matsui_kojima
M365VM_PowerFX_takao-matsumoto_matsui_kojimaM365VM_PowerFX_takao-matsumoto_matsui_kojima
M365VM_PowerFX_takao-matsumoto_matsui_kojima
 
OpenStreetMap and Mapbox
OpenStreetMap and MapboxOpenStreetMap and Mapbox
OpenStreetMap and Mapbox
 
Excel on OneDrive is not a file
Excel on OneDrive is not a fileExcel on OneDrive is not a file
Excel on OneDrive is not a file
 
Development toolsforteamdevelopment
Development toolsforteamdevelopmentDevelopment toolsforteamdevelopment
Development toolsforteamdevelopment
 
React Helmet navigates SPA
React Helmet navigates SPAReact Helmet navigates SPA
React Helmet navigates SPA
 

OptonsPatternDotNet.pptx

Editor's Notes

  1. Options Patternは階層的な設定値構造を構築できます。前回のASP .NET Core Options Patternでは、ホストビルダーで設定値を登録してUI層で利用していましたが、WPFの場合はApp.xamlでの起動のカスタマイズになりますので、App.xamlがMainWindow.xamlを呼び出すより前でASP .NET Core Options Patternのホストビルダーの時と同じように、コンフィギュレーションにOptions Patternを適用する作業を行う必要があります。
  2. ホストビルダーで構築する汎用ホストはWebアプリケーションにもデスクトップネイティブアプリケーションにも使えますので、App.xaml.csのコンストラクタで汎用ホストにOptions Patternを適用したコンフィギュレーションをサービス設定して、各画面で利用できるようにします。 【クリック】各画面では、画面のコンストラクタでOptions Patternを適用したコンフィギュレーションをサービスとして利用できます。この仕組みはASP.NET Core Options PatternでのコントローラーのコンストラクタにOptions Patternを適用したコンフィギュレーションを渡した時と同じ仕組みですので、ASP.NET Core Options Patternのおさらいにもなります。 App.xamlがMainWindow.xamlを呼び出す前にOptions Patternを適用したコンフィギュレーションをサービスするので、App.xamlのMainWindow.xaml呼び出しを止めてから、App.xaml.csのサービス構築後にMainWindowの呼び出しを行うようにします。 【クリック】App.xamlにStartupメソッドを定義、App.xaml.csにStartupメソッド作成して、MainWindowを構築します。MainWindowはサービスとしてホスト構築時に登録しておき、StartupメソッドでMainWindowサービスを表示します。この流れを解説していきます。
  3. まずはASP.NET Core Options Patternのおさらいをしますが、前回はカプセル化と関心ごとの分離についてフォーカスしたお話をしたので、今回は汎用ホストによるビジネスロジックとシステムロジックの分離について注目した話を進めていきます。
  4. まずはASP.NET Core Options Patternのおさらいとして、簡単に流れを説明します。【クリック】
  5. 最初にJSONファイルに設定値を設定します。前回のソースは私のGitHubで公開していますので詳細はGitHubを参照してみてください。
  6. 次にProgram.csでホストビルダーにコンフィギュレーションサービスを設定します。WebApplication.CreateBuilderで作成されたホストにはすでにappsettings.jsonが読み込まれており、同じ構造を持つクラスで型指定されたサービスとして公開できます。 このホストビルダーで作成されたホストは汎用ホストと呼ばれるもので、ログや設定値をインジェクションするためのDIコンテナとして機能します。合わせてアプリケーションのライフサイクル管理を行い、アプリケーションのビジネスロジックからシステムのロジックを切り離すのに有効です。
  7. 利用する側では、コンストラクタで受け取ったコンフィギュレーションサービスをクラスのグローバルスコープの変数に格納して、POSTやGETの各ファンクションで利用することができます。
  8. 各メソッドでの利用時にはJSONと同じ構造のクラスにマップされている各プロパティを利用することができます。
  9. この際にJSONに設定された「English」と「Japanese」を動的に変更できます。画面はIndexになっていますが、POSTで言語指定を受け取れば画面をユーザーが動的に変更することができるようになります。【クリック】 ここで使用している設定値の構造は「English」と「Japanese」という名前で「Brand」と「Pages」というプロパティを持つ型になります。これがOptions Patternのひとつの特長です。同じ構造を持つ型をひとつの定義で指定することができます。
  10. ASP.NET Core Options Patternでは、WebApplication.CreateBuilderによってappsettings.jsonが自動的に読み込まれておりコンフィグレーションサービスをそのまま登録していましたが、WPFで利用するHost.CreateDefaultBuilderはコンフィグレーションサービスを構築するところから始めます。コーディングは次のセクションでお話ししますので、ここではWPFの例を使って.NET CoreでのOptions Patternの仕組みを解説します。
  11. ASP.NET Coreの場合のProgram.csでは汎用ホストのコンフィギュレーションを直接サービス登録していました。 【クリック】WPFの場合はこのホストビルダーの部分が少々手間がかかります。ひとつは、ASP.NET Coreの時に自動的に汎用ホストが読み込んでいたJSONは、明示的に読み込む必要があります。換言するとJSONの物理的な位置を指定できるということです。 【クリック】JSON以外のファイルも扱えるのでこの資料の巻末のリンク「.NET の構成プロバイダー」を参照してください。【クリック:消す】 【クリック】もう一つはアプリケーションの開始フローをカスタムしてMainWindowの前にサービス登録の処理を差し込む必要があります。少し細かく見ていきましょう。【クリック】
  12. ASP.NET Coreでの汎用ホストはProgram.csで定義しました。.NET Coreでの汎用ホストはApp.xaml.csで定義します。 明示的にJSONファイルを読み込むように定義したホストのコンフィギュレーションをサービスに登録するステップは2つです。汎用ホストの「ConfigureAppConfiguration」を使ったアプリケーション設定へのJSONファイルの読み込みと、同じく汎用ホストの「ConfigureServices」を使ったサービスの登録です。 【クリック】そのため、まずMicrosoft.Extensions.Hosting名前空間が必要になります。 【クリック】処理の流れとしては、汎用ホスト「ConfigureAppConfiguration」で取得した「configuration」のソースをクリアしてappsettings.jsonを読み込みます。optionalはappsettings.jsonを省略可能フラグで、「true」を指定するとファイルが無くとも動きます。「reloadOnChange」は、「true」でappsettings.jsonが変更されると再読込します。ここでMicrosoft.Extensions.Configuration名前空間が必要になります。
  13. こうして構築された「configuration」は「ConfigureServices」で「context.Configuration」で取得できますので、同じく取得した「service」にコンフィギュレーションサービスとして登録します。 【クリック】この際にJSONファイルと同じ構造のApplicationContextクラスを型指定してあげることでOptions Patternを利用することができるようになります。このConfigureメソッドの型指定は、TOptions型のIOptionsとしてコンフィギュレーションサービスが受け取ることができますので、Dependency Injectionとしてコンフィギュレーションサービスに後から差し込むことができるわけです。ここではMicrosoft.Extensions.DependencyInjection名前空間が必要になります。
  14. 起動のフローを変更するので、ここからはコーディングを始めます。
  15. まず、任意のフォルダでVisual Studio Codeを起動してCTRL+@でターミナルを表示します。 「dotnet new wpf」でプロジェクトを作成します。
  16. Microsoft.Extensionsの各拡張機能のインストールは、それぞれ「Microsoft.Extensions.Hosting」「Microsoft.Extensions.Configuration」「Microsoft.Extensions.DependencyInjection」をNugetから.NET CLIをコピーしてコマンドをターミナルに貼り付けてインストールします。【クリック】【クリック】
  17. MainWindow表示までの流れはApp.xamlとApp.xaml.csの定義でカスタマイズすることができます。 【クリック】App.xamlでは、StartupUriを削除してStartup時に動作するメソッドを指定します。この例では「Application_Startup」としていますので、後程App.xaml.csにApplication_Startupメソッドを実装します。あわせて終了時のExitメソッドとして「Application_Exit」を指定して、Application_Exitメソッドも後程実装します。 【クリック】次にApp.xaml.csのApplication_StartupメソッドでMainWindowを表示するために、あらかじめ汎用ホストのサービスとしてMainWindowを登録しておきます。【クリック】
  18. 汎用ホストにサービスとして登録されたMainWindowは、App.xaml.csのAppクラスのグローバルスコープとして定義された「_host」のサービスのひとつとして取得できます。「GetRequiredService」は例外時nullを返す「GetService」と異なりInvalidOperationException(サービスが無い場合)やObjectDisposedException(サービスが破棄されている場合)を返すので、後続処理で対応を追加することができます。そのようなオペレーションが想定される場合に使用します。その際、考慮しなければいけないのがサービスのスコープになりますので、後程サービスのスコープに触れます。 【クリック】GetRequiredServiceで取得したサービスの「Show」メソッドでMainWindowが表示されます。
  19. では、このサービスのスコープについて少々触れたいと思います。 【クリック】Microsoft DocsのASP.NET Core での依存関係の挿入、有効期間と登録のオプションのセクションでは、「AddTransient」「AddScoped」「AddSingleton」についてサービスインスタンスにオペレーションIDを付けた検証の方法を紹介しています。「AddTransient」はセッションごとに一意なインスタンスで、「AddScoped」はリクエストごとのインスタンス、「AddSingleton」はアプリケーション一意のサービスインスタンスをアプリケーションホストに追加します。今回のMainWindowサービスではアプリケーション一意のインスタンスを使っていますが、後述するデータコンテキストとコンフィギュレーションサービスがMainWindowで強い依存関係を持ちますので、複数のユーザーにサービスする場合はAddTransientを使ってください。
  20. appsettings.jsonに定義した設定値をMainWindowで使用します。
  21. MainWindow.xaml.csで設定値を使うのですが解説の都合上、コンストラクタですべてを完結します。この解説ではコンストラクタでMainWindowクラスのグローバルスコープの変数に汎用ホストのコンフィギュレーションサービスで受け取ったコンフィギュレーションを格納するので、後々クリックやマウスオーバー、セレクトリストの選択などで利用することもできるようになります。この解説ではコンストラクタですべてを完結させたいので、INotifyPropertyChangedを利用したバインディングを行いますが、そのViewModelの説明の前に構造を先に解説します。 【クリック】MainWindow.xamlではデータコンテキストを設定しておきます。ここでは「MainWindowViewModel」という名前のクラスを使っています。 【クリック】これをMainWindow.xaml.csのコンストラクタでクラスのグローバルスコープ変数「datacontext」に格納して、このビューモデルのプロパティに設定値を投入します。 【クリック】
  22. 設定値は、コンストラクタで受け取った「config」の日本語セクションをグローバルスコープ変数「applicationContext」にバインドしておいて、他のメソッドで使えるようにしておきます。 【クリック】これで、各プロパティ「Brand」や「Page」オブジェクトの「Title」プロパティを使った指定が行えるようになります。 【クリック】【クリック】
  23. ここでは本題から外れますが、動作確認のためのINotifyPropertyChangeを実装したViewModelを作成します。 【クリック】xaml側のデータコンテキスト指定は、Windowに設定してあるのでそのままプロパティをバインドしています。「UpdateSourceTrigger=PropertyChanged」は特になくとも動きます。データコンテキストがINotifyPropertyChangedを継承している場合、既定でPropertyChangedEventHandlerのデリゲートが実行されます。
  24. ViewModel側では、INotifyPropertyChangedを継承してPropertyChangedEventHandlerのデリゲートを宣言して、デリゲートのメソッドを定義します。メソッドでは「CallerMemberName」を使っているので「System.Runtime.CompilerServices」をusingしています。 【クリック】各プロパティはそれぞれプライベート変数に値を格納し出し入れしています。値が同じなら何もせず変更がある場合、デリゲートのメソッドを呼び出します。