2011-01-26 8 views
2

私はDDDブック(Eric Evans)で、プレゼンテーションで使用する必要があるプロシージャをサービスクラスに移動する必要があることを読んでいます。たとえば、BankAccountManagementServiceにはChangeBankAccount、GetByAccountId ...メソッドがあります。ドメインオブジェクトカプセル化:静的メソッドとサービスクラス

しかし、他のビジネスオブジェクトからの割り当てを禁止するいくつかのプロパティのセッターをカプセル化する必要があります。 C#はフレンドリーなクラスを持たないため、サービスの場合にはこのタイプのカプセル化を使用することはできません。しかし、BankAccountビジネスオブジェクトの静的メソッドを使用してそれを行うことは可能です。

(1)上記の理由でサービスを使用する場合、どのようにこの制限を解決しますか?

編集:追加の質問

(2)なぜ静的メソッドの代わりのサービスを利用するために悪いのですか?私はエンティティコードとprocコードを混ぜないように別々の部分クラスファイルに置くことができます。事前に

感謝:)

答えて

6

ドメインオブジェクトのプロパティは、(不変)を設定すべきではない場合、彼らはプライベート(または保護)します。

ドメインオブジェクトのプライベートプロパティを変更するサービスメソッドは、必要な検証とアクセス許可チェックを実行し、変更するプロパティを持つコンストラクタ(idを含む)の1つを使用して新しいオブジェクトを作成し、そのオブジェクトを保存します。

別のオプションは、新しい値と何らかの種類の権限オブジェクトを持つドメインオブジェクトにsetメソッドを設定するか、メソッドに特定の権限を要求する属性を付けることです。そうすれば、セットがどこから呼び出されるかを制約することができます。

編集: 物事を静的にすることは建築的なブラックホールです: あなたはそれらから継承することも、何らかの方法で変更することもできません。 依存性注入を使用できなくなります。 バージョン管理が難しい。いったん静的にしてから使用すると、その決定を元に戻すことは難しいです。 また、静的メソッドではインスタンスデータが使用されていない可能性もありますが、将来はそれが必要になる場合があります。

メソッドがインスタンスメソッドである場合は、多態性とジェネリックを使用して汎用のServiceBaseクラスを作成し、そこによく使用されるメソッドを配置できます。

+0

答えていただきありがとうございます。しかし、なぜ問題なくサービスの代わりに静的メソッドを使用しないのですか? – Danil

+0

静的コメントを反映するように編集された回答 – TimC

+2

@Danil:私が与えた例はこれでした。 BankServiceクラスがあるとします。それはあなたが銀行口座を操作するために必要なすべての方法を持っています。国によって異なる方法が必要な場合はどうなりますか?メソッド名は同じでも構いませんが、そのプロセスは若干異なる場合があります。これは、異なるインスタンスを持つというアイデアがそれ自体を正当化するところです。 2つ以上のインスタンスを持つと、同じプレースホルダ(通常はインターフェイス)を維持しながらサービスをスワップすることができます。静的でこれを行うことは実用的ではありません。実際、静的メソッドはユーティリティクラスに限定する必要があります。 –