David がコメントで指摘したように、仕様に関して有用なことの多くは、LINQ などを使用してより簡潔に実現できるようになりました。
新しい仕様タイプの代わりに、オンザフライで任意の仕様を作成できます。
GetCustomers().Where(customer => customer.IsActive && customer.City == "Oakland");
ただし、これは仕様を完全に置き換えるものではありませんが、いくつかの理由があります。
- すべての顧客を返した後、消費クラスでソート/フィルタリングが行われます。メモリ内オブジェクト以外のものを扱っている場合、これは最適ではありません (LINQ-to-SQL などは例外です。クエリをコンパイルおよび最適化し、サーバー/リモート側で実行して、目的の結果のみを返すためです)。 )。
- コレクションを公開し、仕様を LINQ クエリに任せれば、API はあらゆるクエリに対して広く開かれています。何をどれだけ取得できるかを制限したい場合は、クエリに使用する一連の仕様が必要になります。
確かにどこでも使用する必要はありません。また、まったく必要ない可能性も十分にあります。あなたのドメインや何に取り組んでいるのかわかりません。
最善のアドバイスは、それを使用しようとしないことだと思います。それがいつ保証されるかは、あなたがリンク先の記事の最初の例のようなクラスを書き始めたときにわかるでしょう。
必要に応じて取得できるように、メンタル パターン リポジトリに保管しておいてください。まったく使用しない場合は、必要がなかったことを意味するだけであり、それで問題ありません。
レイヤーの選択は、仕様と用途の性質に左右されます。多くの場合、それらはサービス層をサポートするヘルパーですが、場合によってはドメイン ロジックをカプセル化します。
単体テストに関しては、仕様が単位であるか、または単位を含んでいることに注意してください。可能なすべての仕様の組み合わせで仕様を受け入れるメソッドをテストしないでください。仕様自体をテストして、期待どおりに動作することを確認すると、多くのメソッドやクラスで同じ仕様を自信を持って再利用できます。
それが少し役立つことを願っています。