【问题标题】:using DTOs of ValueObjects to instantiate a Entity使用 ValueObjects 的 DTO 实例化一个实体
【发布时间】:2016-01-23 00:47:06
【问题描述】:

我的问题是关于以下情况。有一个艺术家实体

` public class Artist : Entity
{
    public Contact artistContact { get; private set; }

    internal Artist() { }

    public Artist(Guid _artistId, Contact _artistContact): base(_artistId)
    {
        artistContact = new Contact(_artistContact);
    }

    public Artist(Contact _artistContact) : base()
    {
        artistContact = new Contact(_artistContact);

    }

    public void MakeArt(){} // methods and so on
}`

这个艺术家实体有一个值对象联系人,其中包含他的姓名、电子邮件等。

    `public class Contact : ValueObject<Contact>
{
    readonly string name;
    readonly string email;

    public string Name { get { return name; } }
    public string Email { get { return email; } }

    public Contact(string _name, string _email)
    {
        name = _name;
        email = _email;
    }

}`

所以我的问题是:可以吗

  1. 创建值对象联系人的 DTO
  2. 将 DTO 映射到工厂提供的联系人(ValueObjects 的工厂)
  3. 最后调用 ArtistFactory.Create(Contact)

工厂使用 Activator.CreateInstance(),因此使用构造函数(构造函数的参数)创建对象是通过 Activator 完成的。

我正在尝试确保无法在没有联系人的情况下创建 Artist 实体,但不确定这是处理这种情况的正确方法。欢迎就如何处理此问题提出任何建议。

【问题讨论】:

    标签: c# .net domain-driven-design


    【解决方案1】:

    您正在使您的域复杂化并过度设计简单的对象创建。

    找到合适的名字

    首先,实体不是从天空中创造出来的。也许您可以为您的 ArtistFactory create 方法找到更好的名称。例如register。它确切地说明了那里发生了什么。

    一个工厂

    其次,您需要询问您的业务,Contact 对象是否存在于Customer 之外是否有任何意义?
    I will make assumption, that it can't exist outside of Customer
    那么你的模型是错误的,因为你让人们在艺术家之外创建联系人。 您需要将creationContact 放在ArtistFactory 的内部。

    接下来,您应该想,如果电子邮件不是另一个 VO? 也许您会想在其他地方重复使用它。

    不要创建错误的域对象

    接下来你不应该允许在你的域层中创建错误的对象。现在,通过您的实现,您确实允许例如使用此类字符串“fdsfsdssfsf”和空名称创建电子邮件。我想这不是你所期望的。 您使用公共构造函数和私有设置器创建 VO。 Setter 内部应该有验证。例如检查您的电子邮件是否正确。

    简单的声明。

    创建方法声明应使用本机类型。您将从域外部调用 create 方法,因此映射应该尽可能简单。
    与其通过提供create (Contact contact) 将有关Contact 的信息推送给客户端,不如在Artist Factory 中包含create (string name, string email)

    【讨论】:

    • 感谢您的洞察力,帮了很多忙,只是想再问一个关于MakeArt() 方法的问题。您会看到该方法旨在创建一件新的艺术品(实体,因为每件艺术品的序列号都是唯一的,并且彼此不同(就像在现实生活中一样)),我很困惑如何处理这个问题。应该MakeArt()调用ArtFactory来创建艺术,还是应该在MakeArt()方法中接受适合Art constructor的参数? (没有艺术家,艺术就无法存在)
    • 如果Artist负责创作艺术,那么是的,MakeArt方法()中可能存在所有构造逻辑。但是。我真的不明白艺术家如何负责构建艺术。其次,如果您真的想在 Artist 聚合范围内创建艺术,您应该真正考虑一下。
    猜你喜欢
    • 2018-11-06
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 2016-12-06
    相关资源
    最近更新 更多