【问题标题】:Tracking changes from data transfer object and apply them to domain entity (ddd)跟踪数据传输对象的更改并将其应用于域实体 (ddd)
【发布时间】:2014-11-11 03:03:11
【问题描述】:

例如,我有这个数据传输对象,它携带来自表示层的数据:

public class CompanyDTO
{
    public int Id { get; set; }
    public string Name { get; set; } 
    ...
    ...
    ...
    ...
    public string BlaBla { get; set; }       
}

以及对应的域实体:

public class Company
{
    public int Id { get; private set; }
    public string Name { get; private set; } 
    ...
    ...
    ...
    ...
    public string BlaBla { get; private set; }   

    public void ChangeName(string newName)
    {
        //business logic here

        Name = newName;
    }    
}

更改 Company 类的 Name 属性时存在业务逻辑,因此我不能只将 dto 的属性映射到我的域实体而不关心发生了什么变化。

实体的其他属性也存在相同的情况(例如,包含可能发生变化的其他实体的集合等)

所以问题是,我如何跟踪 dto 中的属性已更改,以便我可以应用适当的方法来做必须做的事情?

有没有比遍历所有这些属性并将它们与我的域实体进行比较更好的方法?

【问题讨论】:

  • 如果您使用基于任务的 ui,您可能不会遇到这个问题。
  • 数据不一定来自ui。它可以是一项服务或任何可以为我服务的 dto。

标签: c# domain-driven-design data-transfer-objects


【解决方案1】:

当命令来自 UI 时,您要么确保意图已经很明显,例如 RenameCompanyCommand,要么尝试通过将 DTO 与域对象的当前状态进行比较来对客户端的意图进行逆向工程。

【讨论】:

  • 所以遍历所有这些属性并将它们与我的域实体进行比较。这是我已经想到的解决方案,但问题是,它是否适用于现实生活中的案例?
  • 我更喜欢在 UI 中捕获意图。如果重命名公司确实有业务逻辑,那么用户对此操作有一个明确的概念是有意义的。
  • 不幸的是,这不是一个选项。关于将 DTO 与域对象的当前状态进行比较还有其他想法吗?
  • 如果您考虑一下,任何其他方法基本上都可以归结为以某种方式将 DTO 与当前状态进行比较......
【解决方案2】:

我不确定这是否适合您,但似乎不是

public string Name { get; private set; } 

public void ChangeName(string newName) 
{
    ...

你可以有

private string _name;
public string Name 
{
    get
    {
        return _name;
    }
    set
    {
        if ( value != _name )
        {
           //business logic here
        }
        _name = value;
    }
} 

如您所见,您无需在更改属性值时调用单独的方法 (ChangeName),而是将业务逻辑直接放在属性的设置器中。仅当分配给属性的新值与之前的值不同时,才会调用该逻辑。

这样当 DTO 和你的业务实体进行简单的映射时,业务逻辑总是会被执行。

【讨论】:

  • 感谢您的回答。我不会这样做,这就是为什么:stackoverflow.com/questions/8291116/… 任何替代方案?
  • 我不会在二传手中加入太多逻辑。我宁愿将if (value != _name) { //business logic here } 放入ChangeName 方法中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 2011-05-11
  • 1970-01-01
  • 2012-01-02
  • 2011-04-23
  • 1970-01-01
相关资源
最近更新 更多