An interesting thread私はこの質問にちょうど今入力しました。私はそれが私の質問に答えるとは思わない。"リッチドメインモデル"は単一責任原則に違反する可能性がありますか?
私は、貧血モデルを持つことが望ましい.NET MVC3で多くの作業をしてきました。ビューモデルと編集モデルは、コントローラからビューに渡すだけのダムデータコンテナとして最適です。あらゆる種類のアプリケーションフローがコントローラから来て、ビューがUIの問題を処理します。 MVCでは、モデル内で動作する必要はありません。
しかし、コントローラにはビジネスロジックも必要ありません。より大きなアプリケーションの場合、ドメインコードをモデル、ビュー、およびコントローラ(およびその点で一般にHTTP)から分離して独立させることが最善です。したがって、ドメインモデル(エンティティと値オブジェクトを持つ、DDDに従って集計されたもの)を他に先んじて提供する別個のプロジェクトがあります。
私はドメインコードで貧血モデルからより豊かなものへと移行しようとしましたが、私はあきらめて考えています。私は、データと動作を含むエンティティクラスがSRPに違反しているように思えます。
たとえば、メールを作成してウェブ上で非常に一般的なシナリオを1つ実行します。いくつかのイベントがある場合、EmailTemplate、EmailAddress、およびカスタム値を指定してEmailMessageオブジェクトを作成するのは、ドメインの責任です。テンプレートはプロパティを持つエンティティとして存在し、カスタム値はユーザーによって入力として提供されます。また、EmailMessageのFROMアドレスが外部サービス(IConfigurationManager.DefaultFromMailAddress)によって提供されるという議論のために、
public class EmailTemplate
{
public EmailMessage ComposeMessageTo(EmailAddress to,
IDictionary<string, string> customValues, IConfigurationManager config)
{
var emailMessage = new EmailMessage(); // internal constructor
// extension method
emailMessage.Body = this.BodyFormat.ApplyCustomValues(customValues);
emailMessage.From = this.From ?? config.DefaultFromMailAddress;
// bla bla bla
return emailMessage;
}
}
これは、豊富なドメインモデルでの私の試みの一つであった。これらの要件を考えると、豊富なドメインモデルがEmailTemplateにEmailMessageのを構成する責任を与えることができるように思えます。このメソッドを追加した後、エンティティデータプロパティを格納してメッセージを作成するのはEmailTemplateの責任でした。それは約15行の長さで、クラスを実際にEmailTemplateになるように散らばっているように見えました。IMOは、データ(件名フォーマット、本文フォーマット、添付ファイル、オプションの/返信先アドレス)。
私はこのメソッドを専用のクラスにリファクタリングしてしまいました。このクラスでは、以前の議論でEmailMessageを作成することに専念しています。実際には、私は貧血の領域を好むようになり始めています。なぜなら、責任と責任を別々にして、クラスや単体テストを短く、簡潔に、より集中的にするためです。エンティティやその他のデータオブジェクトを「行動がない」ものにすることは、責任を分けるうえで良いことになると思われます。または私はここでトラックをオフですか?
リッチドメインモデルは、関連性の高い文脈のためだけに豊富である必要があります。 –