Architecture 这是领域驱动的设计吗?

Architecture 这是领域驱动的设计吗?,architecture,domain-driven-design,Architecture,Domain Driven Design,对于那些领域驱动的开发专家 我试图真正掌握DDD的概念。到目前为止,我一直在设计数据驱动的模型,而不是领域驱动的模型。我读了几篇关于DDD的文章,看起来非常有趣,特别是对于大规模应用。因此,我正在尝试调整我的模型,使其能够做到这一点 我曾经说过,一个客户实体公开了一个冻结帐户的方法,该方法将禁用所有客户帐户。此方法与数据访问无关(基于持久性忽略规则)。它更新每个客户帐户上的标志(按需加载),并将更改保存到数据库。基于这个模型,这是正确的吗?我已经读到,在DDD中,每个表实体不一定只有一个类。此功

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

我试图真正掌握DDD的概念。到目前为止,我一直在设计数据驱动的模型,而不是领域驱动的模型。我读了几篇关于DDD的文章,看起来非常有趣,特别是对于大规模应用。因此,我正在尝试调整我的模型,使其能够做到这一点

我曾经说过,一个客户实体公开了一个冻结帐户的方法,该方法将禁用所有客户帐户。此方法与数据访问无关(基于持久性忽略规则)。它更新每个客户帐户上的标志(按需加载),并将更改保存到数据库。基于这个模型,这是正确的吗?我已经读到,在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
}

首先,在DDD中,与在其他体系结构中一样,数据访问层必须与域和业务逻辑分离,因此实体中没有CRUD操作

因此,要回答这个问题,可以创建一个单独的层(不只是一个类)来读/写存储上的数据,特别是在DDD中,您可以使用Martin Fowler的和模式

如果你想看一个DDD的例子


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

首先,在DDD中,与在其他架构中一样,数据访问层必须与域和业务逻辑分离,因此实体中没有CRUD操作

因此,要回答这个问题,可以创建一个单独的层(不只是一个类)来读/写存储上的数据,特别是在DDD中,您可以使用Martin Fowler的和模式

如果你想看一个DDD的例子


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

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

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


在您的示例中,您很好地利用了对接口(实数形式的I)的编程,这很好,但在不知道系统意图的情况下,很难说此示例是否遵循DDD。

对于DDD,您希望清楚地了解什么是实体(具有唯一ID,并作为单个单元持久化),什么是实体根(您希望向外界公开的实体),什么是服务(管理实体之间交互的代码)

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


在您的示例中,您很好地利用了对接口(实数形式的I)的编程,这很好,但在不知道系统意图的情况下,很难说此示例是否遵循DDD。

感谢您指出,完全同意单独的数据访问层。CustomerDb.Update已经是一个不同的类(DAL)用于数据访问,参数传入ADO.NET/LINQ(使用接口可轻松插入),因此客户类(BLL内部)只调用其方法“Update”它接受ICCustomer类型的参数。我已经为常用层、MVC、会话外观、BLL和DAL以及单元测试编写了自己的代码生成器。我关心的是真正理解以数据为中心和以域为中心的体系结构之间的差异。有趣的文章,期待您的修订。感谢您指出这一点,totally同意单独的数据访问层。CustomerDb.Update已经是一个用于数据访问的不同类(DAL),参数传入ADO.NET/LINQ(使用接口可轻松插入),因此Customer类(BLL内部)只调用其方法“Update”它接受ICCustomer类型的参数。我已经为常用层、MVC、会话外观、BLL和DAL以及单元测试编写了自己的代码生成器。我关心的是真正理解以数据为中心和以域为中心的体系结构之间的差异。有趣的文章,期待您的修订。现在一切都清楚了。我的示例le遵循的是传统的活动记录模式,而不是DDD。业务对象与存储库交互,而不是让应用程序服务与存储库和域(服务/实体)交互关键词:工作单位、实体根和服务有助于澄清问题。谢谢!那你为什么不接受正确的答案呢?:-)现在一切都清楚了。我的示例遵循传统的活动记录模式,而不是DDD。业务对象与存储库交互,而不是让应用程序服务与存储库和域(服务/实体)交互。关键词:工作单元、实体根和服务有助于澄清问题。谢谢那你为什么不接受正确的答案呢?:-)