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

标签 c# wcf entity-framework design-patterns

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

相关文章:

c# - 以字符串形式返回响应

multithreading - 当 InstanceContextMode 为具有 Net.Tcp 绑定(bind)的 WCF 服务的 PerCall 时,Multiple 的 ConcurrencyMode 是否具有相关性?

c# - 有没有办法在 Entity Framework 中强制对相关数据进行排序?

c# - 在解析为XElement之前如何替换字符串中的所有&,<,>?

c# - 在没有不可变字段的类中覆盖 Object.GetHashCode() 时返回什么?

sql - WCF 服务中的 TPL 任务无法使用正确的 IIS 安全凭据(SQL 连接)

c# - WCF中获取回调 channel 的IP地址

c# - 通用 LINQ orderby lambda 函数

c# - MVC5 Identity UserManager.Update(用户)不工作

c# - 以编程方式通过 viber 或 whatsapp 发送消息