【问题标题】:DDD: Administration and encapsulationDDD:管理和封装
【发布时间】:2018-08-04 19:31:28
【问题描述】:

在不破坏封装的情况下更改实体的属性值时,您有哪些方法来处理管理面板与域的通信?

public class Book : Entity {

    public Book(string title, string author, string description, decimal price, short publicationYear) {

        Title = title;
        Author = author;
        Description = description;
        Price = price;
        PublicationYear = publicationYear;
    }

    public string Title { get; private set; }

    public string Author { get; private set; }

    public string Description { get; private set; }

    public decimal Price { get; private set; }

    public short PublicationYear { get; private set; }
}

【问题讨论】:

  • 什么意思?
  • 我的意思是,为了替换实体的值,您为管理面板公开了什么?
  • 管理面板不遵循相同的业务规则?
  • 那么应用程序的其他部分具有与管理面板等操作实体数据相同的能力是一种合适的方法吗?
  • @MrBimber55 封装只是隐藏了消费者不需要看到的细节。由于没有更多关于该域的信息,因此很难说出消费者需要了解的有关Book 的任何信息。据我们所知,您当前的设计可能非常适合封装。

标签: domain-driven-design administration


【解决方案1】:

不破坏封装的唯一方法是将表示逻辑的某些部分包含到对象本身中。请注意,不是细节,而是与该对象高度耦合的部分。

我会做这样的事情(伪代码):

public class Book {
    public Book(...) {
        ...
    }

    public InputComponent<Book> createAdminView() {
        return new FormGroup<Book>(
            new TextInput(title),
            new TextInput(author),
            ...);
    }
}

这样就不需要发布对象的任何内部数据字段,也不需要知道预订的样子,所有与对象相关的更改都会被本地化。

事实上,我已经这样做了好几年了,这种设计使代码更容易维护。看看我关于面向对象的领域驱动设计的演讲以了解更多信息:https://speakerdeck.com/robertbraeutigam/object-oriented-domain-driven-design

【讨论】:

    猜你喜欢
    • 2010-11-11
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多