2016-10-19 20 views
0

ユーザはユーザタイプを持ち、これらのユーザタイプは、独自の属性とユーザテーブルを参照するいくつかのIDを持つデータベースに格納されます。DDD:ユーザータイプを値オブジェクトまたはエンティティにする必要がありますか?

case class User(id: Int, userType: Int, firstName: String, lastName: String) 
case class UserType(id: Int, name: String) 

また、私は集約オブジェクトを持っています。

case class User(userData: User, userType: UserType) 

アプリケーションマネージャは、独自のユーザータイプを作成し、それらを異なるアプリケーションユーザーに割り当てることができます。

追加情報:これらのユーザータイプは作成後は変更できませんが、一部の検証をパスした後に削除することができます。

IDを持つ以外の同じ値を持つ2つのユーザータイプが実際に同じオブジェクトなので、ユーザータイプをエンティティ(あるIDで格納する必要があるため)または値オブジェクトにする必要がありますか? UserTypeは明らかだ独自のリポジトリを、持っている必要がありますので、

EDIT

アプリケーションマネージャは、独自のユーザー・タイプを作成することができます。ユーザーリポジトリは、ユーザータイプ自体を持つ代わりにユーザータイプの参照のみを持つことができますが、ユーザータイプをエンティティまたは値オブジェクトとして扱うことができるかどうかは疑問です。

+1

変更できない場合、なぜ「id」を持っていますか?彼らの名前は彼らの「id」にできないのですか?その場合、それらが価値であることは明らかです。これらの名前を変更し、その変更をすべてのユーザーに反映させたい場合は、 'UserType'がエンティティです。 – plalx

+0

IDはIDの代わりにPKだと思っていたのです。あなたが言ったように、idをWhitoutしてPKとして名前を使用すると、ユーザータイプが値オブジェクトであることがわかります。私はこのIDをPKとして主に使用しました。なぜなら、私はすべてのテーブルのすべてのPKを数値型で書く傾向があり、このドキュメント[リンク](http://database-programmer.blogspot.com.es/2008/01/database -skills-sane-approach-to.html#rule1)正しい方法を学びました。 – CapitanCachopo

+1

永続性パースペクティブから代理IDを取得することはできません。その場合、ドメインモデルがそれを認識しないように、このIDをIdentifiedValueObjectレイヤのスーパータイプに非表示にします。 – plalx

答えて

1

私はその両方と思います。

「ユーザー管理」のコンテキストでは、ユーザータイプVOを使用してユーザーを作成または変更できますが、これは変更できません。ユーザーを作成し、cosntructorでuserType(VO)を要求するか、集約/エンティティ関数を使用してユーザータイプを変更します。すなわち:User.ChangeType(userTypeVO)。

「YourSystem Configuration Context」の場合、削除、変更(スペルミスの修正など)や新しいuserTypesの作成が必要なため、UserTypeをエンティティとして扱う必要があります。

0

あなたの質問は、ビジネスドメインからではなく、永続性の懸念から来ていると思います。 同じ名前で異なるIDを持つ2つのユーザータイプを持つことに意味がありますか?答えが "いいえ"の場合、これは間違いなくバリューオブジェクトです。