gpt4 book ai didi

c# - 有人有聪明的方法将 DTO 视为更多的 OO 类吗?

转载 作者:行者123 更新时间:2023-11-30 22:44:23 25 4
gpt4 key购买 nike

我有一组通过 WCF 序列化的 DataContracts

请注意这是一个非常简化的示例。

[DataContract]
public class MyData
{
[DataMember]
public List<int> MyList
{
get;
set;
}
}

我想使用面向对象的设计,这样服务器和客户端就不会产生任何不必要的依赖关系。比如我想封装一个列表,让用户不能直接修改。

理想情况下,如果类不是 DTO,我希望类看起来像这样。

public class MyData
{
private List<int> _list = new List<int>();

public IEnumerable<int> MyList
{
get
{
return _list;
}
}

public void AddItem( int value )
{
_list.Add( value );
}
}

我在服务和客户端中使用相同的 C# 程序集。所以我可以添加非 DataMember 方法,但我不确定这是否是一个好方法。我闻起来不太对劲。

有没有人有聪明的方法将 DTO 类更像对象而不是简单的可序列化结构?

最佳答案

让您的逻辑类的 DTO 版本仅用于消息传递的目的如何?这样,您可以根据需要将所有方法和属性放在您的逻辑类中,而不必担心用户在通过线路传递时可以访问什么。您可以通过多种方式解决此问题,例如:

你可以在你的逻辑类上实现一些方法来返回 DTO

public class Player
{
// methods that do interesting things here
...

public string Name { get; set; }

public PlayerDTO ToTransport()
{
return new PlayerDTO { Name = Name, ... };
}
}

[DataContract]
public class PlayerDTO
{
[DataMember]
public string Name { get; set; }

...
}

或者你可以实现显式/隐式转换

public class Player
{
// methods that do interesting things here
...

public string Name { get; set; }
}

[DataContract]
public class PlayerDTO
{
[DataMember]
public string Name { get; set; }

...

public static explicit operator PlayerDTO(Player player)
{
return new PlayerDTO { Name = player.Name, ... };
}
}

这让您可以将 Player 对象转换为 PlayerDTO:

var player = new Player { Name = .... };
var dto = (PlayerDTO) player;

关于c# - 有人有聪明的方法将 DTO 视为更多的 OO 类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3453249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com