使用 ValueObjects 的 DTO 来实例化实体

本文关键字:实例化 实体 DTO ValueObjects 使用 | 更新日期: 2023-09-27 18:31:29

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

` 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. Mapp由工厂提供的DTO到联系人(ValueObjects的工厂)
  3. 最后打电话给艺术家工厂.创建(联系)

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

我试图确保在没有联系人的情况下无法创建艺术家实体,并且不确定这是否是处理这种情况的正确方法。欢迎就如何处理此事发表任何意见。

使用 ValueObjects 的 DTO 来实例化实体

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

查找正确名称

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

一家工厂

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

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

不要创建错误的域对象

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

简单声明。

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