1

对于那里的领域驱动开发专家...

我试图真正掌握 DDD 的概念。到目前为止,我一直在将我的模型设计为数据驱动而不是域驱动。我已经阅读了几篇关于 DDD 的文章,看起来非常有趣,尤其是对于大型应用程序。所以我正在尝试定制我的模型来做到这一点。

我说过一个客户实体公开了一个 FreezeAccounts 方法,该方法将禁用所有客户帐户。此方法与数据访问无关(基于 Persistence Ignorance 规则)。它更新每个客户帐户上的标志(按需加载)并将更改保存到数据库。基于这个模型是正确的吗?我已经读过,在 DDD 中,每个表实体不一定只有一个类。这个功能应该在一个单独的类中吗?这是一些示例代码:

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 中,您可以使用 Martin Fowler 的RepositoryUnit Of Work模式。

如果你想要一个 DDD 的例子,请看这里

注意:我必须在 NuGet 上发布我的 DDD 架构“视图”的新版本。

于 2012-06-03T22:24:56.020 回答
-1

使用 DDD,您希望清楚地了解什么是实体(具有唯一 ID,并作为单独的单元持续存在),什么是实体根(您希望向外界公开的实体),以及什么是服务(管理实体之间交互的代码)。

项目在数据库中的持久化方式可能与其实体对象完全不同——但由于您只处理实体,因此外部世界不必担心这一点,它被抽象到 DAL 中。

在您的示例中,您充分利用了对接口(SOLID 中的 I)的编程,这很好,但在不了解系统意图的情况下,很难说该示例是否遵循 DDD。

于 2013-01-28T21:02:44.237 回答