SlideShare una empresa de Scribd logo
1 de 17
コンソールアプリケーションでDIを使う
2019/07/19
自己紹介
- 名前
- 安藤 優一 (ANDOU, Yuuichi)
- 最近の興味
- AWS
趣旨
- ASP.NETで使われているDIの仕組みは
コンソールアプリケーションでも使うことができる
- つまりAWS Lambdaの開発などで使うことができる
- DIをうまく使うとテスタビリティが向上する
- どんな時にDIすると嬉しいかを考える
おさらい(DI)
- DI(Dependency Injection: 依存性の注入)
- 直感的に分かりづらい翻訳。
- 要するに以下のようなデザインパターンである。
- Dependency: クラス内で使用するオブジェクト
- Injection: 自身で生成せず、外で生成して渡す
非DI
DI
おさらい(ASP.NETのDI処理を抜粋)
処理の流れは以下のような感じ。
1. ConfigurationBuilderを作成し、
必要な構成プロバイダを追加する。
2. ServiceCollectionを作成し、
ServiceやOptionを登録する。
3. ServiceCollectionから
IServiceProviderを生成する
4. (IServiceProviderから
Serviceを取得して使う)
コンソールアプリケーションでも同じクラスを使ってDIできる。
1
2
3
4
コンソールアプリケーションでDIを使う
- サービスクラス
- コンストラクタで受け取る
- readonlyフィールドに保持
コンソールアプリケーションでDIを使う
- エントリポイント
1. ConfigurationBuilderを作成し、
必要な構成プロバイダを追加する。
2. ServiceCollectionを作成し、
ServiceやOptionを登録する。
3. ServiceCollectionから
IServiceProviderを生成する
4. (IServiceProviderから
Serviceを取得して使う)
- AWSのLambdaの場合も同様
(FunctionクラスのFunctionHandlerメソッド等)
1
2
3
4
コンソールアプリケーションでDIを使う
- テスト
- テストメソッドごとに注入する例
- 環境を切り替えるには
- テスト用の設定ファイル(json等)
- ハードコーディング
- モッククラスを定義・注入、等
コンソールアプリケーションでDIを使う
- テスト
- 複数のテストを共通の構成で実行する例
- テストフレームワークの初期化の手順に従う
(例: xUnit)
どんな時にDIすると嬉しいか
- 主要クラスは全部DI前提で構築してしまってよさそう。
- 相互依存を回避するなど、クラス設計上の注意点は同じ。
- 他クラスに依存しないクラスはDIしなくてもよい。
- ただし、必ずしもインタフェースと実装を分離させる必要はない。
- 依存するServiceやOptionの差し替えで事足りる場合もある。
- 以下のような性質のクラスは、実装を分離するとよさそう。
- 環境依存、外部リソースへのアクセス
- 副作用を起こす処理
どんな時にDIすると嬉しいか(例:時計)
- 例えば「時計」
- DateTime.Now等をそのまま参照するとテスト実行のたびに結果が変わる。
また、特定日時のテストが困難。
↓
- 「時計」の値が振る舞いに大きく関わるビジネスロジックを書く場合、
「時計」のインタフェースと実装を分けた上でDIするとテストしやすくなる。
どんな時にDIすると嬉しいか(例:時計)
- DateTimeを返すインタフェースを定義する。
どんな時にDIすると嬉しいか(例:時計)
- ビジネスロジック
- IDateTimeをインジェクションする。
- IDateTime経由で時計にアクセスする。
どんな時にDIすると嬉しいか(例:時計)
- プロダクトコードのエントリポイント
- System.DateTime.Nowを返すクラスを定義・構成する。
どんな時にDIすると嬉しいか(例:時計)
- テストコード
- 特定の日時を返すクラスを定義し
て構成する。
- 常に同じ日時でテストできる。
どんな時にDIすると嬉しいか(例:時計)
- 環境依存する箇所を分離させることができた。
- テストもしやすくなった。
- ただし、時刻が重要でないシステムで同じように作り込んでしまうと、
メリットよりもデメリットのほうが大きくなってしまう。
- その他、インタフェースと実装を分けてDIするとよさそうな例
- 認証情報(実行中のユーザ、等)
- ロケール、タイムゾーン
まとめ
- コンソールアプリケーションでもDIを使った開発ができる。
- DIをうまく使うとテストやデバッグがしやすくなる。
- 基本はDI前提で作るが、インタフェースと実装の分離はよく考える。
- DIの是非と、インタフェース分離の是非は別。

Más contenido relacionado

La actualidad más candente

【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介
【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介 【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介
【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介 日本マイクロソフト株式会社
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)mosa siru
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~Daisuke Morishita
 
分かったうえではじめるCI/CD
分かったうえではじめるCI/CD分かったうえではじめるCI/CD
分かったうえではじめるCI/CDYuta Matsumura
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD増田 亨
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
WPF開発での陥りやすい罠
WPF開発での陥りやすい罠WPF開発での陥りやすい罠
WPF開発での陥りやすい罠Sho Okada
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
20160526 依存関係逆転の原則
20160526 依存関係逆転の原則20160526 依存関係逆転の原則
20160526 依存関係逆転の原則bonjin6770 Kurosawa
 
ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?Yoshitaka Kawashima
 
CI/CDって何が良いの?〜言うてるオレもわからんわ〜 #DevKan
CI/CDって何が良いの?〜言うてるオレもわからんわ〜 #DevKanCI/CDって何が良いの?〜言うてるオレもわからんわ〜 #DevKan
CI/CDって何が良いの?〜言うてるオレもわからんわ〜 #DevKanKazuhito Miura
 
ミクシィ 21卒向け Android研修
ミクシィ 21卒向け Android研修ミクシィ 21卒向け Android研修
ミクシィ 21卒向け Android研修akkuma
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチYoshiki Hayama
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはJun-ichi Sakamoto
 
ウェブパフォーマンスの基礎とこれから
ウェブパフォーマンスの基礎とこれからウェブパフォーマンスの基礎とこれから
ウェブパフォーマンスの基礎とこれからHiroshi Kawada
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 

La actualidad más candente (20)

【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介
【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介 【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介
【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
 
分かったうえではじめるCI/CD
分かったうえではじめるCI/CD分かったうえではじめるCI/CD
分かったうえではじめるCI/CD
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
WPF開発での陥りやすい罠
WPF開発での陥りやすい罠WPF開発での陥りやすい罠
WPF開発での陥りやすい罠
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
入門!Jenkins
入門!Jenkins入門!Jenkins
入門!Jenkins
 
20160526 依存関係逆転の原則
20160526 依存関係逆転の原則20160526 依存関係逆転の原則
20160526 依存関係逆転の原則
 
ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?
 
CI/CDって何が良いの?〜言うてるオレもわからんわ〜 #DevKan
CI/CDって何が良いの?〜言うてるオレもわからんわ〜 #DevKanCI/CDって何が良いの?〜言うてるオレもわからんわ〜 #DevKan
CI/CDって何が良いの?〜言うてるオレもわからんわ〜 #DevKan
 
ミクシィ 21卒向け Android研修
ミクシィ 21卒向け Android研修ミクシィ 21卒向け Android研修
ミクシィ 21卒向け Android研修
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
ウェブパフォーマンスの基礎とこれから
ウェブパフォーマンスの基礎とこれからウェブパフォーマンスの基礎とこれから
ウェブパフォーマンスの基礎とこれから
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 

Similar a コンソールアプリケーションでDIを使う

AWS Wavelength最新情報(2020/12)
AWS Wavelength最新情報(2020/12)AWS Wavelength最新情報(2020/12)
AWS Wavelength最新情報(2020/12)Kentaro Matsumoto
 
KDDIにおけるAWS×アジャイル開発
KDDIにおけるAWS×アジャイル開発KDDIにおけるAWS×アジャイル開発
KDDIにおけるAWS×アジャイル開発Kazuya Suda
 
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介Fumiya Sakai
 
2010/12/16 FxUG Robotlegsの発表資料
2010/12/16 FxUG Robotlegsの発表資料2010/12/16 FxUG Robotlegsの発表資料
2010/12/16 FxUG Robotlegsの発表資料豊 満石
 
Azure の ID 管理サービスに LINE ログインを組み込もう
Azure の ID 管理サービスに LINE ログインを組み込もうAzure の ID 管理サービスに LINE ログインを組み込もう
Azure の ID 管理サービスに LINE ログインを組み込もうYuta Matsumura
 
T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門normalian
 
DiI/DIコンテナを一から学んでみた
DiI/DIコンテナを一から学んでみたDiI/DIコンテナを一から学んでみた
DiI/DIコンテナを一から学んでみたtak
 
201806 jawsug bgnr12
201806 jawsug bgnr12201806 jawsug bgnr12
201806 jawsug bgnr12Yuki Yoshida
 
はじめてのAws lambda
はじめてのAws lambdaはじめてのAws lambda
はじめてのAws lambdadcubeio
 
はじめてのAWS Lambda
はじめてのAWS LambdaはじめてのAWS Lambda
はじめてのAWS LambdaMasaki Misawa
 
OpenWhisk Serverless への期待
OpenWhisk Serverless への期待OpenWhisk Serverless への期待
OpenWhisk Serverless への期待Hideaki Tokida
 
アプリ開発&チーム管理で 役立った拡張機能
アプリ開発&チーム管理で役立った拡張機能アプリ開発&チーム管理で役立った拡張機能
アプリ開発&チーム管理で 役立った拡張機能Masaki Suzuki
 
Profile
ProfileProfile
ProfileRyuta5
 
Android Hacks - 合宿 Service
Android Hacks - 合宿 ServiceAndroid Hacks - 合宿 Service
Android Hacks - 合宿 ServiceMasanori Ohkawara
 
Active Directory をInternetから使用するための4つのシナリオ
Active Directory をInternetから使用するための4つのシナリオActive Directory をInternetから使用するための4つのシナリオ
Active Directory をInternetから使用するための4つのシナリオjunichi anno
 
KDDIが考える顧客へ本当の価値を届けるための開発手法
KDDIが考える顧客へ本当の価値を届けるための開発手法KDDIが考える顧客へ本当の価値を届けるための開発手法
KDDIが考える顧客へ本当の価値を届けるための開発手法Tsubasa Hirota
 
現場で使えるDynamoDBと冪等デザインパターン
現場で使えるDynamoDBと冪等デザインパターン現場で使えるDynamoDBと冪等デザインパターン
現場で使えるDynamoDBと冪等デザインパターンcmaraiyusuke
 

Similar a コンソールアプリケーションでDIを使う (20)

AWS Wavelength最新情報(2020/12)
AWS Wavelength最新情報(2020/12)AWS Wavelength最新情報(2020/12)
AWS Wavelength最新情報(2020/12)
 
Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022
 
KDDIにおけるAWS×アジャイル開発
KDDIにおけるAWS×アジャイル開発KDDIにおけるAWS×アジャイル開発
KDDIにおけるAWS×アジャイル開発
 
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
 
2010/12/16 FxUG Robotlegsの発表資料
2010/12/16 FxUG Robotlegsの発表資料2010/12/16 FxUG Robotlegsの発表資料
2010/12/16 FxUG Robotlegsの発表資料
 
Azure の ID 管理サービスに LINE ログインを組み込もう
Azure の ID 管理サービスに LINE ログインを組み込もうAzure の ID 管理サービスに LINE ログインを組み込もう
Azure の ID 管理サービスに LINE ログインを組み込もう
 
T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門
 
Ansible入門.pptx
Ansible入門.pptxAnsible入門.pptx
Ansible入門.pptx
 
DiI/DIコンテナを一から学んでみた
DiI/DIコンテナを一から学んでみたDiI/DIコンテナを一から学んでみた
DiI/DIコンテナを一から学んでみた
 
201806 jawsug bgnr12
201806 jawsug bgnr12201806 jawsug bgnr12
201806 jawsug bgnr12
 
はじめてのAws lambda
はじめてのAws lambdaはじめてのAws lambda
はじめてのAws lambda
 
はじめてのAWS Lambda
はじめてのAWS LambdaはじめてのAWS Lambda
はじめてのAWS Lambda
 
OpenWhisk Serverless への期待
OpenWhisk Serverless への期待OpenWhisk Serverless への期待
OpenWhisk Serverless への期待
 
アプリ開発&チーム管理で 役立った拡張機能
アプリ開発&チーム管理で役立った拡張機能アプリ開発&チーム管理で役立った拡張機能
アプリ開発&チーム管理で 役立った拡張機能
 
Profile
ProfileProfile
Profile
 
Android Hacks - 合宿 Service
Android Hacks - 合宿 ServiceAndroid Hacks - 合宿 Service
Android Hacks - 合宿 Service
 
Introduction sdk
Introduction sdkIntroduction sdk
Introduction sdk
 
Active Directory をInternetから使用するための4つのシナリオ
Active Directory をInternetから使用するための4つのシナリオActive Directory をInternetから使用するための4つのシナリオ
Active Directory をInternetから使用するための4つのシナリオ
 
KDDIが考える顧客へ本当の価値を届けるための開発手法
KDDIが考える顧客へ本当の価値を届けるための開発手法KDDIが考える顧客へ本当の価値を届けるための開発手法
KDDIが考える顧客へ本当の価値を届けるための開発手法
 
現場で使えるDynamoDBと冪等デザインパターン
現場で使えるDynamoDBと冪等デザインパターン現場で使えるDynamoDBと冪等デザインパターン
現場で使えるDynamoDBと冪等デザインパターン
 

Más de Core Concept Technologies

センシングサイエンティストが経費精算を自動化したらこうなった
センシングサイエンティストが経費精算を自動化したらこうなったセンシングサイエンティストが経費精算を自動化したらこうなった
センシングサイエンティストが経費精算を自動化したらこうなったCore Concept Technologies
 
開発環境をWindowsからMacに移行してみた話
開発環境をWindowsからMacに移行してみた話開発環境をWindowsからMacに移行してみた話
開発環境をWindowsからMacに移行してみた話Core Concept Technologies
 
データソースにLinqDataSourceを使った場合のGridViewの高速化
データソースにLinqDataSourceを使った場合のGridViewの高速化データソースにLinqDataSourceを使った場合のGridViewの高速化
データソースにLinqDataSourceを使った場合のGridViewの高速化Core Concept Technologies
 
Pythonでディープラーニングをはじめるための一歩目
Pythonでディープラーニングをはじめるための一歩目Pythonでディープラーニングをはじめるための一歩目
Pythonでディープラーニングをはじめるための一歩目Core Concept Technologies
 
Pythonで簡単な統計・分析をしてみよう!
Pythonで簡単な統計・分析をしてみよう!Pythonで簡単な統計・分析をしてみよう!
Pythonで簡単な統計・分析をしてみよう!Core Concept Technologies
 
Google Colab環境でPythonスクレイピング
Google Colab環境でPythonスクレイピングGoogle Colab環境でPythonスクレイピング
Google Colab環境でPythonスクレイピングCore Concept Technologies
 
ロボットと協働生活中に試行錯誤したこと
ロボットと協働生活中に試行錯誤したことロボットと協働生活中に試行錯誤したこと
ロボットと協働生活中に試行錯誤したことCore Concept Technologies
 
なぜIoTプロジェクトは途中でとまってしまうのか。
なぜIoTプロジェクトは途中でとまってしまうのか。なぜIoTプロジェクトは途中でとまってしまうのか。
なぜIoTプロジェクトは途中でとまってしまうのか。Core Concept Technologies
 
工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介します
工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介します工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介します
工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介しますCore Concept Technologies
 
AIによる簡単レコメンドシステム実装
AIによる簡単レコメンドシステム実装AIによる簡単レコメンドシステム実装
AIによる簡単レコメンドシステム実装Core Concept Technologies
 

Más de Core Concept Technologies (20)

センシングサイエンティストが経費精算を自動化したらこうなった
センシングサイエンティストが経費精算を自動化したらこうなったセンシングサイエンティストが経費精算を自動化したらこうなった
センシングサイエンティストが経費精算を自動化したらこうなった
 
C#で速度を極めるいろは
C#で速度を極めるいろはC#で速度を極めるいろは
C#で速度を極めるいろは
 
開発環境をWindowsからMacに移行してみた話
開発環境をWindowsからMacに移行してみた話開発環境をWindowsからMacに移行してみた話
開発環境をWindowsからMacに移行してみた話
 
Linqの速度測ってみた
Linqの速度測ってみたLinqの速度測ってみた
Linqの速度測ってみた
 
データソースにLinqDataSourceを使った場合のGridViewの高速化
データソースにLinqDataSourceを使った場合のGridViewの高速化データソースにLinqDataSourceを使った場合のGridViewの高速化
データソースにLinqDataSourceを使った場合のGridViewの高速化
 
ロボットアームをPythonで動かす
ロボットアームをPythonで動かすロボットアームをPythonで動かす
ロボットアームをPythonで動かす
 
Pythonでディープラーニングをはじめるための一歩目
Pythonでディープラーニングをはじめるための一歩目Pythonでディープラーニングをはじめるための一歩目
Pythonでディープラーニングをはじめるための一歩目
 
Pythonで簡単動画解析
Pythonで簡単動画解析Pythonで簡単動画解析
Pythonで簡単動画解析
 
Pythonで簡単な統計・分析をしてみよう!
Pythonで簡単な統計・分析をしてみよう!Pythonで簡単な統計・分析をしてみよう!
Pythonで簡単な統計・分析をしてみよう!
 
Google Colab環境でPythonスクレイピング
Google Colab環境でPythonスクレイピングGoogle Colab環境でPythonスクレイピング
Google Colab環境でPythonスクレイピング
 
可視化の先にあるものとは
可視化の先にあるものとは可視化の先にあるものとは
可視化の先にあるものとは
 
ロボットと協働生活中に試行錯誤したこと
ロボットと協働生活中に試行錯誤したことロボットと協働生活中に試行錯誤したこと
ロボットと協働生活中に試行錯誤したこと
 
3Dモデル類似検索
3Dモデル類似検索3Dモデル類似検索
3Dモデル類似検索
 
GPUいらずの高速動画異常検知
GPUいらずの高速動画異常検知GPUいらずの高速動画異常検知
GPUいらずの高速動画異常検知
 
固有表現抽出と適用例のご紹介
固有表現抽出と適用例のご紹介固有表現抽出と適用例のご紹介
固有表現抽出と適用例のご紹介
 
深層強化学習入門
深層強化学習入門深層強化学習入門
深層強化学習入門
 
なぜIoTプロジェクトは途中でとまってしまうのか。
なぜIoTプロジェクトは途中でとまってしまうのか。なぜIoTプロジェクトは途中でとまってしまうのか。
なぜIoTプロジェクトは途中でとまってしまうのか。
 
工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介します
工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介します工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介します
工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介します
 
AIによる簡単レコメンドシステム実装
AIによる簡単レコメンドシステム実装AIによる簡単レコメンドシステム実装
AIによる簡単レコメンドシステム実装
 
Orizuru IoTは何を変えたのか
Orizuru IoTは何を変えたのかOrizuru IoTは何を変えたのか
Orizuru IoTは何を変えたのか
 

Último

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Último (11)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

コンソールアプリケーションでDIを使う

Notas del editor

  1. コンソールアプリケーションでDIを使う、というテーマで発表させていただきます。 よろしくお願いいたします。
  2. 安藤優一と申します。
  3. 趣旨は以下のとおりです。 コンソールアプリケーションでDIする際のコード例と、 どんな時にDIすると嬉しいか、についてお話ししたいと思います。
  4. まず、DIとは何かについて簡単におさらいします。 DI、DependencyInjectionは、一般的に依存性の注入と訳されます。 直感的に分かりづらいので、個人的には、あるクラス内で使用するオブジェクトを、外で生成して渡す、そういうデザインパターンだと解釈して説明するようにしています。
  5. ASP.NETは起動時に以下のような流れでDIの構成を行っています。 ... なお、ASP.NETの場合はControllerもServiceProviderが生成するので、この4の手順を直接記述することはないと思います。 コンソールアプリケーションでも、同じクラスを使うことでDIを構成できます。
  6. 実際にコンソールアプリケーションでの実装例をご紹介します。 まずはサービスクラスです。 ASP.NETで定義するときと同様、コンストラクタで依存オブジェクトを受け取ります。 サービスクラスについては、コンソールアプリケーションだからといって特別な実装はありません。
  7. 次にエントリポイント、ProgramクラスのMainメソッドです。 先ほどまとめた通り、ConfigurationBuilderを生成し、...します。
  8. テストの例です。 テストメソッドごとに構成する場合は、メソッド内で使用するサービスやOptionを構成します。 プロダクトコードではjsonなどから設定を読み込んでいますが、テスト時はハードコーディングすることも可能です。 この例では接続先をテスト用に変えていますが、モッククラスを注入する方法でもよいと思います。
  9. テストメソッドごとではなく、複数のテストで共通の構成を使用する場合、テストフレームワークの手順にしたがって初期化します。 例えばxUnitの場合、テストクラスのコンストラクタでServiceProviderを生成してメンバに保持しておくことで、各テストメソッドは同じProviderを使ったテストができます。
  10. どんな時にDIすると嬉しいかについて考えてみますが、 基本方針として、主要クラスはすべてDI前提で構築してしまってよいと思っています。 DI以前の問題として、依存の方向を統一したり、といった設計に注意する必要はあります。 また、他クラスに依存しないクラスはDIに登録しないようにする、といった、開発のポリシーを考えておく必要はあると思います。 DIするといっても、必ずしもインタフェースと実装を分離させる必要はないと思います。 例えばビジネスロジックは、実装の差し替えではなく接続文字列などOptionの変更で十分なケースもあると思います。 どういう時にインタフェースと実装を分けるかというと、以下のようなコードがよさそうだと思います。 ...
  11. 例えば、時計です。
  12. コード例です。 まず、DateTimeを返すインタフェースを定義します。 ここではNowだけを定義してますが、要件に応じてUtcNowやOffsetなどを適宜定義するとよいと思います。
  13. ビジネスロジックは、...
  14. プロダクトコードでは、...
  15. テストコードでは、... こうすることで、例えば税率変更前後の閾値テストを厳密に行うことができるようになります。
  16. 環境依存箇所を分離させ、テストしやすくなりました。 ただし、... (コードが煩雑になりすぎる等) ほかにも、... 先ほどの時計の例と同じように、...
  17. まとめです。 … 以上です。ありがとうございました。