我们在WCF服务接口中使用Dtos,但是当Dto表示的业务对象实现多个接口并且我们想要在这些不同的上下文中返回Dtos并且还能够处理时,它们已经开始遇到问题Dtos在客户端上进行多态化.
例如,假设我们有一个IBusinessObject包含多个属性的接口,这些属性包含对象关系,对象属性等的详细信息.我有几个实现,这个LinearBusinessObject实现IBusinessObject和ILinear.还有其他实现ILinear不是业务对象,只是简单的线性事物.
我们的服务有一个获取业务对象的方法.这将返回一个基本Dto类(BusinessObjectDto),它声明了IBusinessObject(关系属性等)的公共部分,并LinearBusinessObjectDto扩展BusinessObjectDto并添加了有关线性方面的额外信息.这很好,并使客户端能够BusinessObjects以一定程度的多态性处理返回的内容.
我们还想要一种获得线性事物的方法.这将返回一个LinearDto包含公共线性详细信息的基类.简单的线性对象实现扩展LinearDto,一切都很好.但是现在我遇到了一个问题,因为我无法LinearBusinessObjectDto从两者扩展LinearDto而且BusinessObjectDto因为只支持单继承,并且我不能使用接口,因为WCF不知道哪些类型然后放入服务合同定义中WDSL.
所以我开始为我的2 dtos LinearBusinessObject,一个派生自BusinessObjectDto(LinearBusinessObjectAsBusinessObjectDto)和一个派生自LinearDto(LinearBusinessObjectAsLinearDto),然后根据我感兴趣的界面转换每个.
这似乎会导致许多额外的Dto类(我已经有很多),所以我想知道是否有比这更好的解决方案?或者这只是我们必须忍受的东西?
我正在尝试实现一个用于WCF的字典.我的要求是:
System.StringComparer.InvariantCultureIgnoreCase我试图在WCF主机和客户端项目共享的公共项目中使用此类:
[Serializable]
public class MyDictionary : Dictionary<string, object>
{
public MyDictionary()
: base(System.StringComparer.InvariantCultureIgnoreCase)
{ }
public new void Add(string key, object value)
{ /* blah */ }
public override string ToString()
{ /* blah */ }
}
[DataContract]
[KnownType(typeof(MyDictionary))]
[KnownType(typeof(object[]))]
[KnownType(typeof(double[]))]
[KnownType(typeof(string[]))]
[KnownType(typeof(DateTime[]))]
public class ResultClass
{
public object Value{ get; set; }
/* More properties */
}
public class ParmData
{
public object Value{ get; set; }
/* More properties */ …Run Code Online (Sandbox Code Playgroud) 我有类BookDTO表示将用于在客户端和服务之间交换数据的对象,其中服务是wcf服务具有以下属性
[Serializable]
[DataContract]
[KnownType(typeof(Book))]
public class BookDTO {...}
Run Code Online (Sandbox Code Playgroud)
这种装饰物体的正确(标准)方式是通过电线发送的吗?我见过的例子
[DataContract(NameSpace="somenamespace.DTO.Book")]
Run Code Online (Sandbox Code Playgroud)
正在[KnownType(typeof(Book))]这里redudant?
我忘了提到我已经介绍了DataMember属性,所以请忽略它.