我有一个net.tcp
WCF 服务及其客户端,每个都在一个程序集中,并共享另一个包含服务接口和 DTO 的程序集。
Channel
客户端使用实例化的 through实现为服务的代理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;
}
正如预期的那样,SomeList
客户端返回的 DTO 字段是一个数组,但我希望它由 WCF 转换为List
. 正如您可能从所描述的设置中怀疑的那样,我不使用svcutil
(或添加服务引用对话框),所以我不能使用configureType
.
我不想修改客户端代理以实例化列表并修改客户端代理中接收到的 DTO,因为实际实现使用命令处理器,使用在运行时通过依赖注入解析的接口来避免耦合 - 这个解决方案可以相反,通过要求客户端执行已知的服务命令。
因此,我目前正在使用修改 DTO 以在内部创建 List 实例的变通方法:
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
?也许通过ImportOptions.ReferencedCollectionTypes
或CollectionDataContract
?