2013-06-04 198 views
6

私は、多くの場合、WPF-MVVMアプリケーションのモデルにSingletonsまたはStaticクラスを使用することが理にかなっているように見えることがわかりました。ほとんどの場合、これは私のモデルのほとんどがアプリケーションを通してアクセスされる必要があるためです。私のモデルをstaticにすることは、この要件を満たす簡単な方法になります。静的なクラスやシングルトンをMVVMに使用するよりも良い方法はありますか?

しかし、私は地球上の誰もがシングルトンを嫌うように見えるので、私は競合しています。だから私はそこにもっと良い方法がないと思っているのですか、あるいは明らかに間違っていることをやっているのでしょうか?

+3

"MODELS"を静的にするいいえ、実際はありません。少しでも。それは[RegExでHTMLを解析する](http://stackoverflow.com/a/1732454/643085) –

+0

Hehよりもさらに悪いことです。私には抵抗できませんでした。 – sircodesalot

+0

DIを静的にするのではなく、ContainerControlledLifetimeManagerでコンテナに登録します。静的であれば、スレッドの安全性に関する問題が増えます。 –

答えて

5

はシングルトンの問題のカップルがあります。私はそれらを以下に概説し、いくつかの代替解決策を提案する。私は彼らが自分の用途を持っていると信じているように、 "シングルトンを使わないでください。しかし、これらの用途はまれです。

  1. スレッドセーフです。グローバル静的シングルトンを使用している場合は、何かにいつでもアクセスできるため、スレッドセーフでなければなりません。これは追加のオーバーヘッドです。

  2. ユニットテストはシングルトンでは難しくなります。

  3. グローバル変数を安価に置き換えることができます(つまり、方法やその他の面白いことがあるかもしれませんが、シングルトンは終わりです)。

を参照してください、それはシングルトンのは、それ自体は「恐ろしい憎むべきもの」であることではないのですが、それは最初のデザインパターンだと、多くの新しいプログラマがに対処するために取得し、その落とし穴(ただ、上のいくつかのギアをスティックの利便がが難読化それをスチームパンクと呼ぶ)。

あなたのケースでは、モデルを参照していますが、これらは常に自然にデータを反映するため、「インスタンス」です。おそらく、あなたはこれらのインスタンスを取得するコストが心配です。私を信じて、それらは無視できるものでなければなりません(明らかにデータアクセス設計に至るまで)。

代替手段はありますか?モデルを必要とする場所にモデルを渡します。これにより単体テストがより簡単になり、そのモデルの基本を一気に交換することができます。これはまた、インタフェースを見たいと思うかもしれないことを意味します - これは契約を意味します。これらのインターフェースを実装する具体的なオブジェクトを作成することができます。コードは簡単にユニットテスト可能で変更可能です。

シングルトンの世界では、そのシングルトンを1回変更すれば、コードベースのすべてが根本的に破壊される可能性があります。良いことではありません。

+0

ニース。私は言う:あなたが別の選択肢を持っていない限り、シングルトンを使用しないでください。 –

2

この問題の解決策は、依存性注入を使うことです。依存性注入を使用すると、モデルを通常の非静的クラスとして定義し、必要に応じてモデルのインスタンスを制御コンテナにインバージョンすることができます。

WPFで依存性注入を行う方法を示しwpftutorial.netで素敵なチュートリアルがあります:http://wpftutorial.net/ReferenceArchitecture.html

+0

興味深い。私は数週間前にDIを学び始めました。私はそのバックアップをピッキングするように見えます。ありがとう。 – sircodesalot

2

私が使用する唯一の静的なクラスは、アプリケーションを通して同じインスタンスがすべて必要なため、MessageBrokerです。

でも、Unity(または別のDependency Injection/Container)を使用して、必要なクラスのインスタンスを管理することは非常に可能です。

これにより、必要に応じて異なるバージョンを注入できます(例:ユニットテスト中)

BTW:スタティックはシングルトンと同じではありません。しかし、私はここには入りません。その上でもっと楽しい質問のためにstackoverflowを検索してください:)

関連する問題