我有一个存在于服务器上的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() {}
}
私有构造函数和私有设置器帮助这个类成为强类型,遵守 DRY 原则,并确保它只能在有效状态下被实例化。
例如,我确保IsTaxable未在构造函数中设置,而是根据其他类属性动态评估。这样,如果修改了EmployeeType , IsTaxable的结果将反映这种变化。我用这个简单的例子来强调这个对象逻辑丰富的事实。
假设这个Employee类存在于服务器上,我希望在客户端上访问它。我构建了一个 WebService(在 .NET 中我将使用 WCF),公开该类并使用开箱即用的工具连接,并且能够在我的客户端中通过网络使用该类。
问题是,这样做会导致我丢失大部分封装的逻辑。在接收端,客户端看不到这个富类及其私有设置器、隐藏构造函数、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;
失去丰富的对象仅仅是面向服务的生活的一个事实,是我们必须忍受的事情吗?
此类服务传输对象是否仅出于传输信息的目的而被视为弱数据传输实体,并且应该是只读的。
在客户端,您是否应该(如果需要)将它们包装在更丰富的对象中?
是否有任何方法可以通过线路传递逻辑完整的丰富对象,或者是否真的需要?
是否有任何既定的模式来处理这种情况?