Edited at

[WPF]prism.unity(6.3.0)を試したまとめ(RegisterTypeとRegisterInstanceの違いなど)


prism.unity関連


この記事について

この記事は、前二つの記事(↑参照)のまとめです。


試した環境

モノ
バージョン

VisualStudio
2017

Prism.Unity
6.3.0


RegisterTypeとRegisterInstanceの違い

使うメソッド
用途/特徴

RegisterInstance                    
動的な情報を登録する(外部で作成したインスタンスをコンテナに渡す)注入したいクラスに、new時に引数を渡したい場合は、こっちをすればよいっぽい。

RegisterType                      
静的な情報を登録(登録時はインスタンス化なしで、注入時にコンテナ内で都度インスタンスを作成する)

参考:【Unity】RegisterInstanceとRegisterTypeの違い。


コードから見たDIの便利ポイント

※本格的な実践はしてないので、以下はほぼ想像です。

実際に簡単なDIを使うコードを書いてみて、下記が便利かなと思った。

注入するクラス(今回でいうとDogCat)を、使うところ(Person)でnewしなくてよいので、Personの単体テストをするときに、DogやCatを単体テスト用のものに差し替えたいとき、登録の部分(RegisterInstance)でnewしているところだけ差し替えればよいので、Personの中でnewしてるところを書き換えるよりは確かに楽そう。(特に、DogやCatを使うところが多い場合に)

単体テスト用猫クラスを作って、

public class UnitTestCat : IAnimal

{
public UnitTestCat() => Console.WriteLine(" UnitTest猫 コンストラクタ");
public void Cry() => Console.WriteLine("UnitTestニャ~");
}

登録の部分だけ差し替える。

container.RegisterInstance<IAnimal>(new UnitTestCat());

これで実行すると、注入される側のPersonに何も手を入れなくても、単体テスト用の猫クラスを使って、Personが動く。

同じように、分担して開発してるときに、Personクラスを作っている人は、とりあえず簡易的に動かすための猫クラスを作っておいて、Personクラスの開発中はそれで猫を動かす。猫が出来上がったら、登録の部分だけそっちに載せ替える、ということができそうなので、確かに楽になりそう。


わかったこと


  • DIは、注入される側クラスのコンストラクタの引数で、そこで使うクラスのインスタンス(=依存性)を渡してやって実現できないこともないが、多数のクラスインスタンス(=依存性)を使う場合、コンストラクタの引数で多数のクラスインスタンスを受け渡ししないといけなくなり、煩雑になる。(参考:こういうやり方)

  • そういった問題を緩和するために、DIのためのライブラリが存在している。


    • .netで使えるものでいうと、prism.unitymefがある。

    • DIコンテナを自前でつくると大変なので、一般的には、これらのライブラリを使ってDIを行う。

    • DIコンテナを使うと、単体テストや分担開発が楽になる...っぽい。



  • 確かに試してみたように、単体テストや分担開発が楽になりそうな気がするが、DIのためのコードをかかないといけないので、デメリットもありそう。(想像するに、下記)


    • コード量が増える(インターフェース必須、DIに登録/注入等しないといけない)

    • 分担が楽だということは、逆に分担しない/一人で開発するようなときは、「分担開発が楽」のメリットは半減しそう。

    • DIのライブラリに色々(バージョンも日々新しくなっている)あって、書き方が日に日に変わっていくので、自分(と周りの関係者)がそれを知っていないといけない、また流れに追いついてないといけない。(それって、一般的なレベル(=全員がDIに詳しいわけではない)の会社で、分担開発が楽になってるといえるのか?)

    • 開発の途中からDI導入、とかは難しそう。割とスキルのある(DIを使っての設計をよくわかっている)メンバーが、最初からきちんとつくること前提でないと、DIコンテナがあるのに使ってない、とか無茶苦茶になりそうな気がする。




今回の結論


  • 確かに、単体テスト、分担開発ではうまくやれば便利そう。

  • ただし比較的大きな開発の場合に限られる。一人で開発するような小さなものについてはDIは要らなさそう使わないという選択肢もアリ。


参考

かずきさんprism教育ページ

prismを、機能一つ一つに分けて説明してある。

https://github.com/runceel/PrismEdu

DIの解説

DIについて、コードを交えて優しく書いてくれている。

https://hiroronn.hatenablog.jp/entry/20170531/1496186979

DI(Unity)でInstanceを登録、読み出しのサンプル~依存性注入

サンプルコード。

http://blogs.wankuma.com/nakamura/archive/2008/10/28/160029.aspx

http://blogs.wankuma.com/nakamura/archive/2008/10/29/160096.aspx

RegisterInstanceとRegisterTypeの違い

http://pro.art55.jp/?eid=1177842