使用ValueObjects的DTO实例化实体

时间:2016-01-23 00:47:07

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

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

` 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;
    }

}`

所以我的问题是:是否可以

  1. 创建价值对象联系人的DTO
  2. Mapp将DTO联系到工厂(ValueObjects的工厂)
  3. 最后致电ArtistFactory.Create(联络)
  4. 工厂使用Activator.CreateInstance(),因此使用构造函数(构造函数的参数)创建对象是通过Activator完成的。

    我正在尝试确保在没有联系人的情况下无法创建Artist实体,并且我不确定这是处理此情况的正确方法。任何关于如何解决这个问题的讨论都是值得欢迎的。

1 个答案:

答案 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方法,因此映射应该尽可能简单 不是通过提供Contactcreate (Contact contact)的信息推送到客户端,而是应该create (string name, string email)中有Artist Factory

相关问题