使用 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;
}
}`
所以我的问题是:可以吗
- 创建值对象联系人的 DTO
- Mapp由工厂提供的DTO到联系人(ValueObjects的工厂)
- 最后打电话给艺术家工厂.创建(联系)
工厂使用 Activator.CreateInstance(),因此使用构造函数(构造函数的参数)创建对象是通过 Activator 完成的。
我试图确保在没有联系人的情况下无法创建艺术家实体,并且不确定这是否是处理这种情况的正确方法。欢迎就如何处理此事发表任何意见。
您正在使您的域复杂化,并过度设计简单的对象创建。
查找正确名称
首先,实体不是从天空创建的。也许您可以为您的ArtistFactory
create
方法找到更好的名称。例如register
.它准确地说,那里发生了什么。
一家工厂
其次,您需要询问您的业务,Contact
反对,在Customer
之外存在有任何意义吗?
I will make assumption, that it can't exist outside of Customer
.
那么你的模型是错误的,因为你让人们在艺术家之外创建联系人。您将需要将Contact
的creation
放在ArtistFactory
内。
接下来,您应该考虑,如果电子邮件不是另一个 VO?也许你会想在其他地方重用它。
不要创建错误的域对象
接下来,您不应该允许在域层中创建错误的对象。现在,通过您的实现,您确实允许例如使用此类字符串"fdsfsdssfsf"和空名称创建电子邮件。我想这不是你所期望的。您可以使用公共构造函数和私有资源库创建 VO。二传手内部应该有验证。例如,检查您的电子邮件是否正确。
简单声明。
创建方法声明应使用本机类型。您将从域外部调用 create 方法,因此映射应尽可能简单。
与其通过提供create (Contact contact)
将有关Contact
的信息推送给客户端,不如在Artist Factory
中create (string name, string email)
。