1

そこにいるドメイン駆動開発の専門家へ...

私はDDDの概念を本当に理解しようとしています。これまでのところ、ドメイン駆動型ではなくデータ駆動型になるようにモデルを設計してきました。DDD に関する記事をいくつか読んだことがありますが、特に大規模なアプリケーションの場合は非常に興味深いと思いました。だから私は自分のモデルをまさにそれを行うように調整しようとしています.

私は、すべての顧客アカウントを無効にするメソッド FreezeAccounts を公開する顧客エンティティを言いました。この方法は、データ アクセスには関係ありません (持続性無視ルールに基づく)。各顧客アカウント (オンデマンドで読み込まれる) のフラグを更新し、変更をデータベースに保存します。このモデルに基づいてそれは正しいですか?DDD では、テーブル エンティティごとにクラスが 1 つだけであるとは限らないことを読みました。この機能は別のクラスにする必要がありますか? サンプルコードは次のとおりです。

public class Customer : ICustomer, ICustomerAction
{
    #region Initialization
    public Customer()
    {
    }

    internal Customer(ICustomer view)
    {
        this.CustomerId = view.CustomerId;
        this.Name = view.Name;
        this.Email = view.Email;
        this.IsActive = view.IsActive;
    }
    #endregion

    #region Instances

    private AccountCollection _accounts;

    #endregion

    #region Properties

    #region ICustomer

    public int CustomerId { get; private set; }
    public string Name { get; set; }
    public string Email { get; set; }

    #endregion

    #region Derived

    public AccountCollection Accounts
    {
        get
        {
            if (_accounts == null)
                _accounts = Account.GetListByCustomerId(CustomerId);
            return _accounts;
        }
    }

    #endregion

    #endregion

    #region Methods

    #region CRUD

    // Data Access Object accepts interface ICustomer
    internal void Update()
    {
        CustomerDb.Update(this); 
    }

    #endregion

    #region ICustomerAction

    // Exposed business Persistence Ignorance action
    internal void FreezeAccounts()
    {
        foreach (Account account in this.Accounts)
        {
            account.IsEnabled = false;
            account.Update();
        }
    }

    #endregion

    #endregion
}
4

2 に答える 2

2

まず、他のアーキテクチャと同様にDDDでは、データアクセス層をドメインおよびビジネスロジックから分離する必要があるため、エンティティへのCRUD操作はありません。

したがって、答えるには、はい、ストレージ上のデータを読み書きするための別のレイヤー(クラスだけでなく)を作成します。特にDDDでは、MartinFowlerによるリポジトリ作業単位のパターンを使用できます。

DDDの例が必要な場合は、こちらをご覧ください。

注:DDDアーキテクチャの「ビュー」の新しいリビジョンをNuGetで公開する必要があります。

于 2012-06-03T22:24:56.020 に答える
-1

DDD では、エンティティ (一意の ID を持ち、個々のユニットとして永続化される) とは何か、エンティティ ルート (外部に公開するエンティティ) とは何か、およびエンティティとは何かを明確に理解しておく必要があります。サービス (エンティティ間の相互作用を管理するコード)。

アイテムが DB に永続化される方法は、エンティティ オブジェクトとはまったく異なる場合がありますが、エンティティのみを扱うため、外部の世界はそれについて心配する必要がなく、DAL に抽象化されます。

あなたの例では、インターフェイス (SOLID の I) へのプログラミングをうまく利用していますが、システムの意図を知らなければ、このサンプルが DDD に従っているかどうかを判断するのは困難です。

于 2013-01-28T21:02:44.237 に答える