【发布时间】:2012-08-24 09:44:54
【问题描述】:
我有一个自定义类的列表,它是 mvvm 模式中的模型。 我需要在 DB 中插入列表数据。 那么任何人都可以建议将此列表传递给网络服务的最佳方法是什么?
谢谢
【问题讨论】:
标签: silverlight web-services mvvm
我有一个自定义类的列表,它是 mvvm 模式中的模型。 我需要在 DB 中插入列表数据。 那么任何人都可以建议将此列表传递给网络服务的最佳方法是什么?
谢谢
【问题讨论】:
标签: silverlight web-services mvvm
如果列表不是太大,您可以尝试将列表序列化并“按原样”发送。如果它太大,您的服务的 MaxReceivedMessageSize 和 maxBufferSize 属性可能会出现问题,您应该将它们设置得尽可能大。当然,我假设你有相同的模型双方(客户端和服务器)来序列化和反序列化它。
要减少您发送的数据大小,您可以尝试使用 TCP 绑定而不是 HTTP。
如果它仍然太大,您可能需要将列表分块并通过多次调用相同的服务来发送它。
在很多情况下,我也做了几种变通方法。例如,如果您只需要更新仅更改几个字段的对象列表,我会使用创建一个新的 object-id + 新值列表并在服务器端进行更改,而不是更改客户端中的所有内容,然后将其发送到服务器。
希望这对你有帮助;-)
【讨论】:
我们公开一个发送和接收 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);
}
【讨论】: