0

現在のプロジェクトでは、WPF、MVVM、およびEntityFrameworkを使用しています。

簡単にするために、材料のリスト(無垢材)に対するCRUD操作のビューモデルがあるとします。

私のViewModelのEFコンテキスト(WTContext)は、プロパティインジェクションによって初期化されます。次に例を示します。

SolidWoods_VM newView = new SolidWoods_VM();
newView.Context = new WTContext(SettingsManager.Instance.GetConnectionString());

このようにして、このViewModelをテストできます。

SolidWoods_VM swVM = new SolidWoods_VM();
swVM.Context = new FakeWTContext();

挿入操作中に問題が発生し、WTContext.SaveChanges()が失敗したとします。ViewModelsコンテキストを更新するための最良の方法は何ですか?

  1. ForTestingPurposesという名前のビューモデルに新しいboolプロパティを作成し、SaveChangesメソッドが失敗した場合:

    try
    {
        Context.SaveChanges();
    }
    catch
    {
        if (!ForTestingPurposes)
        {
            Context = new WTContext(SettingsManager.Instance.GetConnectionString());
        }
    }
    
  2. コンテキストの再読み込みのためにmainviewmodelにメッセージを送信します(メディエーターパターンを介して):

    Mediator.Instance.NotifyColleagues<SolidWoods_VM>(MediatorMessages.NeedToUpdateMyContext, this);
    

(ただし、この方法では、boolプロパティが必要です)

3.追加のプロパティを使用せずに、よりエレガントなソリューションを提供します:)

4

2 に答える 2

1

データコンテキストで必要なメソッド/プロパティをインターフェイスに抽象化してから、例外を処理する実装を作成してみませんか。

//WARNING: written in SO window
public interface IDataSource
{
    void SaveChanges();
    //... and anything else you need ...
}

public class RealDataSource : IDataSource
{
    private WTContext _context;

    public void SaveChanges()
    {
        try { _context.SaveChanges(); }
        catch
        {
            _context = new WTContext(/*...*/);
        }
    }
}

このようにして、偽の/モックデータソースを実装することはできますが、ビューモデルクラスは、データが実際にどのように取得されるかについて何も知る必要はありません。

于 2012-06-04T10:42:02.143 に答える
0

私の意見では、あなたの最善の策はメッセージでしょう。

保存が失敗したことを示す方法が必要であり、コンテキストを再生成するためにクラスのすべてのコンシューマーに役立つとは限りません。たとえば、そこでVMにバインドしている場合、コンテキストをリセットすると、他のUIの結果が生じる可能性があります。

于 2012-06-01T14:22:23.740 に答える