我的问题是关于以下情况。有一个艺术家实体
` 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
}`
此Artist实体具有一个值对象联系人,其中包含他的姓名,电子邮件等。
`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;
}
}`
所以我的问题是:是否可以
工厂使用Activator.CreateInstance(),因此使用构造函数(构造函数的参数)创建对象是通过Activator完成的。
我正在尝试确保在没有联系人的情况下无法创建Artist实体,并且我不确定这是处理此情况的正确方法。任何关于如何解决这个问题的讨论都是值得欢迎的。
答案 0 :(得分:1)
您正在使您的域复杂化并过度设计简单的对象创建。
首先,实体不是从天空创建的。也许您可以为ArtistFactory
create
方法找到更好的名称。例如register
。它确切地说,那里发生了什么。
其次,您需要询问您的公司,Contact
对象,Customer
之外是否存在任何意义?
I will make assumption, that it can't exist outside of Customer
。
那么你的模特是错的,因为你让人们在艺术家之外创造了联系。
您需要将creation
Contact
放在ArtistFactory
内。
接下来,您应该想一想,如果电子邮件不是另一个VO? 也许你会想在其他地方重复使用它。
接下来,您不应该允许在域图层中创建错误的对象。现在通过您的实现,您可以允许例如使用此类字符串创建电子邮件&ffffsdssfsf&#39;和空名。我想这不是你所期望的。 您使用公共构造函数和私有setter创建VO。 Setters应该在里面进行验证。例如,检查您的电子邮件是否正确。
创建方法声明应使用本机类型。您将从域外调用create方法,因此映射应该尽可能简单
不是通过提供Contact
将create (Contact contact)
的信息推送到客户端,而是应该create (string name, string email)
中有Artist Factory
。