所以,我创建了几个WCF服务。每个返回列表的某种类型的数据合同。但是,这些数据合同具有其他数据合同的列表属性。我正在尝试实现数据契约集合的延迟加载。
我所想到的是在客户端实现一个类,该类继承了数据协定,并且集合属性重写,因此setter和getter方法调用服务并获取实际的集合项。
我的问题是:如何让基本渠道返回实现数据合同的类而不是实际的数据合同?如何控制基本频道返回的内容?
我的服务客户端如下所示:
public class ServiceClient : BaseClient<IServiceClient>
{
public IList<DataObject> FindAll()
{
// how to control what base.Channel.FindAll return during deserialization.
return base.Channel.FindAll();
}
}
请注意,我不想做这样的事情:
public class ServiceClient : BaseClient<IServiceClient>
{
public IList<DataObject> FindAll()
{
var dtos = base.Channel.FindAll();
var dtoProxies = Mapper.Map<DataObject, DataObjectProxy>();
return dtoProxies;
}
}
我想要一种方法,以便WCF自动返回List<DataObject>
哪些元素实际上是DataObjectProxy
类型。
有关如何执行此操作的任何建议吗?
谢谢!
编辑:示例DataObject类:
[DataContract]
public class DataObject
{
public virtual List<OtherDomainObject> SubItems { get; set; }
}
public class DataObjectProxy : DataObject
{
public override List<OtherDomainObject> SubItems
{
get { // Custom way to retrieve collection... }
set { // Etc.. }
}
}
答案 0 :(得分:0)
首先,使用[DataContract]属性修饰DataObjectProxy,WCF要求所有类型的显式合同标识 - 无论您以后要做什么。然后,在要向客户端公开的数据协定类型的每个字段(在您的案例中为属性)上设置[DataMember]。 最后,在DataObject类上添加[KnownType(typeof(DataObjectProxy))]属性。 KnownType定义客户端上多态替换的给定基的所有子类型。 这应该有用。
[DataContract]
[KnownType(typeof(DataObjectProxy))]
public class DataObject
{
[DataMember]
public virtual List<OtherDomainObject> SubItems { get; set; }
}
[DataContract]
public class DataObjectProxy : DataObject
{
[DataMember]
public override List<OtherDomainObject> SubItems
{
get { // Custom way to retrieve collection... }
set { // Etc.. }
}
}