我有一组通过 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/