1

我有一个net.tcpWCF 服务及其客户端,每个都在一个程序集中,并共享另一个包含服务接口和 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.ReferencedCollectionTypesCollectionDataContract

4

1 回答 1

1

有4种方式:

  1. 在客户端的保存方法中将数据转换为列表

  2. 更改属性类型:

    public IList<int> SomeList;
    

    public List<int> SomeList;
    
  3. 您在上面显示的方法(更改分配的类型)。

  4. 实施 IDataContractSurrogate。但是您必须在客户端应用一种行为。
于 2014-04-14T10:13:10.623 回答