我有一个net.tcp
WCF服务及其客户端,每个服务都在一个程序集中,并共享另一个包含服务接口和DTO的程序集。
使用通过Channel
实例化的ChannelFactory
将客户端实现为服务的代理:
public ServiceClient : IService
{
IService _channel;
public ServiceClient()
{
_channel = new ChannelFactory<IService>("NetTcp_IService")
.CreateChannel();
}
public DTO ServiceMethod()
{
return _channel.ServiceMethod();
}
}
public class DTO
{
public IList<int> SomeList;
}
正如预期的那样,客户端返回的DTO的SomeList
字段是一个数组,但我希望它由WCF转换为List
。正如您可能怀疑所描述的设置,我不使用svcutil
(或添加服务参考对话框),所以{{ 3}}
我不想修改客户端代理以实例化列表并在我的客户端代理中修改收到的DTO,因为实际实现使用命令处理器使用通过依赖注入解析的接口 - 时间避免耦合 - 这个解决方案会做相反的事情,要求客户端执行已知的服务命令。
因此,我目前正在使用I can't use configureType
:
public class DTO
{
private IList<int> _someList;
public IList<int> SomeList
{
get { return _someList; }
set {
if (value != null)
_someList = new List<int>(value);
else
_someList = new List<int>();
}
}
}
但是,我宁愿避免这种情况。所以问题是:
如何配置WCF反序列化以便array
转换为预期的List
?
有没有办法通过App.config
中的绑定或Channel
创建时的代码来配置反序列化?可能通过the work-around which modifies the DTO to internally create the List instance或ImportOptions.ReferencedCollectionTypes
?
答案 0 :(得分:1)
有四种方式:
更改属性类型:
public IList<int> SomeList;
到
public List<int> SomeList;