4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-14

Prism関連
https://qiita.com/tera1707/items/4fda73d86eded283ec4f#prism%E9%96%A2%E9%80%A3wpfxaml

この記事について

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

試した環境

モノ バージョン
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

4
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?