1

我们有一个包含数据和方法的实体(类)(我们称之为 Person)。还有其他类需要使用此对象中的数据(我们称其中之一为 Accountant),但不需要使用其方法中的功能。

将整个 Person 对象发送给 Accountant 还是创建一个新的 PersonData 对象来保存数据并将其发送给 Accountant obj 会更好吗?

我们确实有一个案例需要解决这个问题,但我想知道最好的一般答案,以便我们可以在整个过程中使用它。

4

5 回答 5

4

通常,您会在需要以某种序列化形式使用数据的地方移交 DTO——例如通过 Web 服务或智能客户端。如果您只是在域中使用 Person 对象,并且已经正确封装,为什么还要努力创建 DTO?

于 2009-12-22T19:50:58.953 回答
2

正如其他人所说,使用 DTO 没有任何意义,除非不涉及转移...... :)

我建议的解决方案是将传递给Accountant接口的对象抽象IAccounteePerson实现它......我不熟悉C#(从你的个人资料中,我推断这是你选择的语言:)),但是这个可能应该为您指明正确的方向:

class Accountant {
    //....
    public void performAction(IAccountee target) 
    {

    }
}
interface IAccountee
{
    string Name
    {
        get;
    }
    int Salary
    {
        get;
        set;
    }
}

class Person : IAccountee
{
    //implementation here, as well as some stuff specific to Person
}

基本上,这就是SOLID中的D :) ...它既灵活又干净,还避免了与...共享不必要的信息PersonAccountant

据我了解,C# 接口不能需要变量(如在大多数语言中一样),这会迫使您创建访问器(除非有一些语言/IDE 功能可以生成默认的普通访问器),如果您还没有这样做的话......它比使用普通变量更耗时,并且需要比普通字段访问更多的性能,但是 OTOH,这也是我认为好的做法,至少当事情没有得到性能时......我认为这绝对是比创建额外的 DTO 类和来回复制数据(或至少在一个方向上)更优雅......

希望对您有所帮助... ;)

于 2009-12-22T20:33:23.330 回答
1

我会说 OOP 会让你使用在 person 类中定义的“get”方法。我不会发送整个对象,因为会计不需要整个对象,只需要选择性数据。我不会说后者,因为您正在创建不必要的大量冗余。

但是像这样的 OOP 是高度理想化的,所以换一种方式可能会更好......

于 2009-12-22T19:52:57.410 回答
1

我通常保留使用 DTO 进行数据的跨层传输。如果不是这种情况,我不确定创建一个令人信服的理由。

于 2009-12-22T19:55:15.737 回答
0

我认为这是一个信任边界的问题。在业务应用程序中,信任边界通常决定了您的层架构。如果您的“会计师”在 Person 的信任边界之外,那么应该进行某种模型转换。架构和需求应该决定什么样的转换。

于 2009-12-22T20:10:13.787 回答