2010-11-26 7 views
1

私はこのウェブサイトを最近見つけたことをとてもうれしく思っています。私はここから多くを学びました。
私は中国出身です。私の英語はあまり良くありません。しかし、私は何を言いたいのか自分自身を表現しようとします。永続性の無知を実装するには、集約子をパブリックプロパティとして公開する必要がありますか?

最近、私はドメイン駆動型設計について学び始めました。私は非常に興味があります。私はDDDを使ってフォーラムのウェブサイトを開発する予定です。

ここからスレッドをたくさん読んだあと、永続性の無知が良い方法であることを理解しました。

現在、私は長い間、何を考えているのかという2つの質問があります。

  1. ドメインオブジェクトはリポジトリと対話してデータを取得/保存する必要がありますか?
  2. ドメインオブジェクトがリポジトリを使用しない場合、どのドメインオブジェクトが新規/変更/削除されたかをInfrastructureレイヤ(作業ユニットなど)はどのように知っていますか?

2番目の質問です。サンプルコードがあります: は、私は、ユーザーのクラスがあるとします。上記のUserクラスに基づいて

public class User 
{ 
public Guid Id { get; set; } 
public string UserName { get; set; } 
public string NickName { get; set; } 

/// <summary> 
/// A Roles collection which represents the current user's owned roles. 
/// But here i don't want to use the public property to expose it. 
/// Instead, i use the below methods to implement. 
/// </summary> 
//public IList<Role> Roles { get; set; } 

private List<Role> roles = new List<Role>(); 
public IList<Role> GetRoles() 
{ 
    return roles; 
} 
public void AddRole(Role role) 
{ 
    roles.Add(role); 
} 
public void RemoveRole(Role role) 
{ 
    roles.Remove(role); 
} 
} 

、私はIUserRepositoryからユーザーを取得し、そのための役割を追加したとします。この場合

IUserRepository userRepository; 
User user = userRepository.Get(Guid.NewGuid()); 
user.AddRole(new Role() { Name = "Administrator" }); 

、私は仕事のリポジトリまたは単位は、ユーザーが新しい役割を持っていることを知ることができないのか分からないのですか?

実際の永続性の無知ORMフレームワークはPOCOをサポートする必要があり、変更はPOCO自体で発生し、永続性フレームワークは自動的に知っているはずです。上記の例のようにメソッド(AddRole、RemoveRole)を使ってオブジェクトの状態を変更しても、

ロールプロパティを使用すると、多くのORMが自動的に変更を永続化できることがわかりますが、パフォーマンス上の理由からこの方法が嫌いです。

誰でも私にこれについていくつかのアイデアを教えてください。ありがとう。

これはこのサイトの私の最初の質問です。私は英語が理解できることを願っています。
すべての回答は非常に高く評価されます。

答えて

1

ドメインオブジェクトはリポジトリと対話してデータを取得/保存する必要がありますか?

いいえ、そうしてはいけません。その理由は簡単です - カプセル化。私たちのドメインモデルに関連する永続性をすべて取り除くと、我々のドメインをはるかに明確に記述することができます。

ドメインオブジェクトでリポジトリが使用されていない場合は、インフラストラクチャレイヤ(作業ユニットなど)はどのドメインオブジェクトが新規/変更/削除されたかをどのように知っていますか?

最も単純なバージョンはありません。あなたは取得し(集計上の操作が完了した後に)全体としてそれをバック保存:

var user = users.Find(guid); 
user.AssignRole(Role.Administrator); 
users.Save(user); 

私は個人的にNHibernateはに依存している - それは、変更自体を追跡します。適切なeager/lazyローディングでクエリを最適化し、httpリクエストの終了時にのみ変更を保存し、トランザクションを忘れずにキャッシングを使用してください。パフォーマンス上のペナルティはありません。しかし、価格については、それを処理するためにいくつかの知識が必要です。

もう1つ - フォーラムの開発にドメイン駆動型デザインを使用する前にもう一度考えてください。このアプローチは、未知の(まだ)複雑なビジネスドメインにのみ適合します。これは、単純なアプリケーションのための過剰です。

もう一つのこと - あなたの英語を恥じることをやめてください。それはすぐに良くなるでしょう。 :)

関連する問題