「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-戻る
-[[戻る>IoC、AOP → DI → 依存性反転原則]]
--[[IoC]]
--[[AOP]]

* 目次 [#yfe8b965]
#contents

*概要 [#kcff7f34]

**DI [#g0f585b6]
-DI: Dependency Injection
-依存性の注入
DI: Dependency Injection(依存性の注入)
-Dependency InjectionのDependencyは依存性と訳すと誤解を生む。
-正確には「使われるオブジェクト」(依存オブジェクト)という意味。

**DIとは? [#i845c8a5]
[[依存性>#e6b1e28b]]を無くすために、動的に動作を[[注入>#m5bae250]]する。

***依存性 [#e6b1e28b]
-あるクラスに、固定の定数、変数、インスタンスが入っている状態
-つまりそのクラスは、その定数、変数、インスタンスに依存している。

***注入 [#m5bae250]
-そのクラスの外から定数、変数、インスタンスを設定する。
-これにより、動的に動作を変えられるようにする。

***ユースケース [#t8611952]
-「[[IoC]]」, 「[[AOP]]」を実現する技術の一つ。~
しかし、「[[依存性>#e6b1e28b]]とはコアで、[[アスペクト>AOP]]とはコアではない。」と言う意見もある。
**ユースケース [#t8611952]
※「[[依存性>#e6b1e28b]]がコアの懸念で、[[AOPのアスペクト>AOP]]とはコアの懸念ではない。」と言う意見もある。

-モックの差し替えなどを実現し、テストを容易にする。
-フレームワークの差し替えを実現し、特定のフレームワークへの依存性を減らす。
***「[[IoC]]」, 「[[AOP]]」の実現 [#be2b0e90]
「[[IoC]]」, 「[[AOP]]」を実現する技術の一つ。

**問題点 [#xc8aa161]
「[[IoC]]」や「[[AOP]]」自体にも言えることになるが、~
同時に全体として協調動作させるときに複雑さが増す。
***「[[依存性反転原則]]」の実現 [#x104b569]
[[依存性反転原則]]を実現する技術の一つ。

**.NETにおけるDI [#r01c8a11]
- Spring .NETによりサポートされていた模様。
-モックの差し替え~
モックの差し替えなどを実現し、テストを容易にする。

-[[ASP.NET Core によって DI がサポートされるようになった>ASP.NET Core における DI]]。
-フレームワークの差し替え~
フレームワークの差し替えを実現し、特定のフレームワークへの依存性を減らす。

***テストでの利用 [#q0124c15]
モック差し替え。

***フレームワーク自身の利用 [#k1f914e9]
Session、認証、ASP.NET Identityのconfig等をProgram.csとか、Setup.csに書かせるアレ。

*詳細 [#v2c96ec6]

**DIの種類 [#pdd79724]
プログラムに依存性を注入する方法としては、以下のような手法が存在する。

***interface注入 [#k505f870]
注入用のinterfaceを定義して注入を行う方法

***setter 注入 [#wed7c280]
setter メソッドを定義して注入を行う方法

***constructor注入 [#pf220003]
constructorを定義して注入を行う方法

**コンテナー [#ed773e54]
-依存関係を作成する専用のクラス。
--要求された依存関係をインスタンスの作成で行う。
---依存関係はハードコーディングではなく、構成により宣言。
---依存関係のある型のインスタンスを提供するファクトリ。
--依存関係だけでなく、ライフサイクルも管理する。

-以下のように呼ばれる。
--制御の反転 ([[IoC]]) コンテナー
--依存関係の挿入 ([[DI]]) コンテナー

*その他 [#w56ca3fe]

**問題点 [#xc8aa161]

***複雑さが増す。 [#ue9bd465]
「[[IoC]]」や「[[AOP]]」、「[[依存性反転原則]]」自体にも言えるが、~
同時に全体として協調動作させるときに複雑さが増す。

***共通I/Fが無い場合。 [#s4b6d372]
-共通I/Fが無いDI場合のDIはユーザのレイヤでしか利用できない。~
(ユーザがDIしたものなので、ユーザが型情報を知っている)

-下位レイヤで利用するには、≒ 共通I/Fが必要。~
(ユーザがDIしたものなので、下位レイヤは型情報を知らない)

**実現方法 [#e830c78f]

***.NETにおけるDI [#r01c8a11]
- Spring .NETによりサポートされていた模様。

-[[ASP.NET Core によって DI がサポートされるようになった>ASP.NET Core における DI]]。

*参考 [#o0eed8a3]
-DI(依存性注入)について~
https://www.slideshare.net/yuiito94/di-56742600
-依存性の注入 - Wikipedia~
https://ja.wikipedia.org/wiki/%E4%BE%9D%E5%AD%98%E6%80%A7%E3%81%AE%E6%B3%A8%E5%85%A5

**Qiita [#bb3ab861]
-猿でも分かる! Dependency Injection: 依存性の注入~
https://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f

-「なぜDI(依存性注入)が必要なのか?」~
についてGoogleが解説しているページを翻訳した~
https://qiita.com/mizunowanko/items/53eed059fc044c5aa5dc

-DI(Dependency Injection) の解説~
https://qiita.com/okadabasso/items/066efc2e728a666b8732

-Dependency Injection: 依存性の注入 のお役立ち例~
https://qiita.com/saeki4n/items/22a276dcac9ef537ee25

**[[ASP.NET Core における DI]] [#dea1500b]

----
Tags: [[:プログラミング]], [[:.NET開発]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS