2

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

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 中的属性已更改,以便我可以应用适当的方法来完成必须做的事情?

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

4

2 回答 2

3

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

于 2014-09-17T10:35:30.430 回答
1

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

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 和您的业务实体之间的简单映射时,将始终执行业务逻辑。

于 2014-09-17T07:22:20.740 回答