0

mvvm パターンのモデルであるカスタム クラスのリストがあります。リスト データを DB に挿入する必要があります。では、このリストを Web サービスに渡す最良の方法を提案できる人はいますか?

ありがとう

4

2 に答える 2

0

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);
}

エミットマッパーはこちらから入手できます

于 2012-08-25T03:54:44.460 に答える
0

リストが大きすぎない場合は、リストをシリアライズして「そのまま」送信し​​てみてください。大きすぎると、サービスの MaxReceivedMessageSize および maxBufferSize プロパティで問題が発生する可能性があるため、できるだけ大きく設定する必要があります。もちろん、シリアル化および逆シリアル化するために、両側 (クライアントとサーバー) に同じモデルがあると仮定します。

送信するデータ サイズを減らすには、HTTP の代わりに TCP バインドを使用してみてください。

それでも大きすぎる場合は、リストをチャンクにして、同じサービスを数回呼び出して送信する必要がある場合があります。

多くの場合、いくつかの回避策も実行しました。たとえば、いくつかのフィールドだけを変更するオブジェクトのリストを更新するだけでよい場合は、オブジェクト ID + 新しい値の新しいリストを作成し、クライアントのすべてを変更してからサーバーに送信するのではなく、サーバー側に変更を加えます。サーバー。

これがお役に立てば幸いです;-)

于 2012-08-24T10:58:48.750 に答える