C# 使用面向服务的体系结构支持富对象传输的设计模式?

C# 使用面向服务的体系结构支持富对象传输的设计模式?,c#,web-services,design-patterns,coding-style,C#,Web Services,Design Patterns,Coding Style,我在服务器上有一个Employee类,我希望在web服务中公开它,以便客户端可以使用它 这是我的班级: public class Employee { public CountryCode { get; private set;} public EmployeeType {get; set;} public bool IsTaxable { get { return (CountryCode != Codes.

我在服务器上有一个Employee类,我希望在web服务中公开它,以便客户端可以使用它

这是我的班级:

public class Employee
{
    public CountryCode { get; private set;} 
    public EmployeeType {get; set;}

    public bool IsTaxable
    {
       get
       {
           return (CountryCode != Codes.CaymanIslands 
                  && Status != EmployeeType.Contract);
       }
    }

    public void Employee(EmployeeType type, CountryCode code)
    {
        EmployeeType = type;
        CountryCode = code;
    } 

    private void Employee() {}
}
私有构造函数和私有setter帮助该类成为强类型,遵守DRY原则,并确保它只能在有效的状态下实例化

例如,我确保未在构造函数中设置IsTaxable,而是基于其他类属性动态计算。这样,如果修改了EmployeeType,则IsTaxable的结果将反映此更改。我使用这个简单的例子来强调这个对象具有丰富的逻辑

假设这个Employee类位于服务器上,我希望在客户端访问它。我构建了一个WebService(在.NET中,我将使用WCF),公开该类并使用现成的工具connect,并且能够在我的客户机中跨线路使用该类

问题是,这样做会导致me丢失大部分封装逻辑。在接收端,客户端无法使用私有setter、隐藏构造函数、IsTaxable属性中的逻辑等来查看这个富类。相反,在客户端,我将看到这样一个轻量级类:

public class Employee
{
    public CountryCode { get; private set;} 
    public EmployeeType {get; }
    public bool IsTaxable {get; }
}
现在,客户机可以通过如下操作在无效状态下实例化类:

Employee e = new Employee();
e.EmployeeType = EmployeeType.Contractor;
e.IsTaxable = true;
失去富对象只是面向服务生活的一个事实,是我们不得不忍受的吗

此类服务传输对象是否被视为仅用于传输信息的弱数据传输实体,并且应该是只读的

在客户端,您是否应该(如果需要)将这些内容包装到更丰富的对象中

是否有任何方法可以将逻辑完整的富对象传递到一条线路上,或者确实需要这样做


是否存在处理此类场景的既定模式?

在查看设计模式之前,首先需要了解的是您实际希望逻辑发生在何处,以及如果“恶意”客户端更改其通过线路接收的数据,实际会发生什么情况

大多数客户机-服务器体系结构的设计方式是,客户机尝试执行的任何操作都必须由服务器验证。因此,如果客户机决定将
IsTaxable
更改为true,或更改员工的姓名或ID等,则其不会对存储在服务器端的真实数据产生任何影响。客户机必须执行更新服务器上数据的操作,只有在他有权这样做的情况下,数据才会传播到数据库和系统的其余部分

客户端总是处于“风险中”(它可能被用户操纵、被黑客攻击、通过网络嗅探等),因此服务器必须足够安全,以承受这种情况

“传输对象”通常仅用于传输数据。然后,任何逻辑要么由客户机执行(例如,将数据格式化为更用户友好的表示),要么由服务器执行。如果客户端需要对数据执行操作,则需要请求服务器执行(以便集中更新)

因此,在您的情况下,您的Web服务需要为您的客户机公开操作,以执行您可能需要的任何逻辑

您可能还想了解的另一件事是如何创建web服务。这被认为是一种最佳实践,因为它不仅可以确保web服务与其他平台(如Java)互操作,还可以让您考虑要向客户机公开哪些操作和数据,并帮助您避免犯错误(例如需要只有服务器才能访问的对象实例)


契约优先意味着创建描述操作的WSDL和描述要以XML传输的消息和对象的XSD。它们可以帮助您从那些WSDL和XSD文档自动生成代码

在查看设计模式之前,您首先需要了解的是,您实际希望逻辑发生在何处,以及如果“恶意”客户端更改它通过线路接收的数据,会发生什么情况

大多数客户机-服务器体系结构的设计方式是,客户机尝试执行的任何操作都必须由服务器验证。因此,如果客户机决定将
IsTaxable
更改为true,或更改员工的姓名或ID等,则其不会对存储在服务器端的真实数据产生任何影响。客户机必须执行更新服务器上数据的操作,只有在他有权这样做的情况下,数据才会传播到数据库和系统的其余部分

客户端总是处于“风险中”(它可能被用户操纵、被黑客攻击、通过网络嗅探等),因此服务器必须足够安全,以承受这种情况

“传输对象”通常仅用于传输数据。然后,任何逻辑要么由客户机执行(例如,将数据格式化为更用户友好的表示),要么由服务器执行。如果客户端需要对数据执行操作,则需要请求服务器执行(以便集中更新)

因此,在您的情况下,您的Web服务需要为您的客户机公开操作,以执行您可能需要的任何逻辑

您可能还想了解的另一件事是如何创建web服务。这被认为是一种最佳实践,因为它不仅可以确保web服务与其他平台(如Java)互操作,还可以让您考虑要向客户机公开哪些操作和数据,并帮助您避免犯错误(例如需要只有服务器才能访问的对象实例)

契约优先意味着你创造了y