【问题标题】:What is the best pratice to pass a list of (MVVM) Model class to web service将(MVVM)模型类列表传递给Web服务的最佳实践是什么
【发布时间】:2012-08-24 09:44:54
【问题描述】:

我有一个自定义类的列表,它是 mvvm 模式中的模型。 我需要在 DB 中插入列表数据。 那么任何人都可以建议将此列表传递给网络服务的最佳方法是什么?

谢谢

【问题讨论】:

    标签: silverlight web-services mvvm


    【解决方案1】:

    如果列表不是太大,您可以尝试将列表序列化并“按原样”发送。如果它太大,您的服务的 MaxReceivedMessageSize 和 maxBufferSize 属性可能会出现问题,您应该将它们设置得尽可能大。当然,我假设你有相同的模型双方(客户端和服务器)来序列化和反序列化它。

    要减少您发送的数据大小,您可以尝试使用 TCP 绑定而不是 HTTP。

    如果它仍然太大,您可能需要将列表分块并通过多次调用相同的服务来发送它。

    在很多情况下,我也做了几种变通方法。例如,如果您只需要更新仅更改几个字段的对象列表,我会使用创建一个新的 object-id + 新值列表并在服务器端进行更改,而不是更改客户端中的所有内容,然后将其发送到服务器。

    希望这对你有帮助;-)

    【讨论】:

      【解决方案2】:

      我们公开一个发送和接收 DTO 的 WCF 服务,然后在 Silverlight 中创建一个服务引用。我们在 Silverlight 中使用 EmitMapper 将模型类映射到代理生成的 DTO。

      更新了代码示例。

      服务器端的DTO类:

      public class CompanyDTO
      {
          public string Name
          {
              get;
              set;
          }
      }
      

      WCF 服务接口:

      [ServiceContract]
      public interface IUpdateService
      {
          [OperationContract]
          void InsertCompanies(List<CompanyDTO> companies);
      }
      

      WCF 服务实现:

      public class UpdateService : IUpdateService
      {
          public void InsertCompanies(List<CompanyDTO> companies)
          {
              // insert stuff into database
          }
      }
      

      Silverlight 中的模型类:

      public class Company
      {
          public string Name
          {
              get;
              set;
          }
      }
      

      调用代理:

      public MainPageViewModel()
      {
          var company = new Company { Name = "Amalgamated Co." };
          var companyDTO = EmitMapper.ObjectMapperManager.DefaultInstance
                  .GetMapper<Company, UpdateServiceProxy.CompanyDTO>().Map(company);
      
          UpdateServiceProxy.IUpdateService client = new UpdateServiceProxy.UpdateServiceClient();
          client.BeginInsertCompanies(
                  new ObservableCollection<UpdateServiceProxy.CompanyDTO> { companyDTO }, null, null);
      }
      

      Emit Mapper is available here

      【讨论】:

      • 谢谢 boris 你有一些示例代码吗,你在这里解释一下
      猜你喜欢
      • 2012-07-22
      • 2011-01-20
      • 2013-07-12
      • 2011-02-13
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      相关资源
      最近更新 更多