1

ローカルデータベース(SQL Express経由)とEntity FrameworkORMとして使用して、 WPFでプロジェクトに取り組んでいます。

Viewクラスと同じ数のViewModelを実装したいと思います。1対1の関係の一種で、MVVMを実装するための良い方法だと聞きました(同意しない場合は、理由を教えてください)。これについての私のビジョンは、すべてのViewModelがそのビューを提供することです(つまり、 Modelレイヤーによって提供されるデータベースからのデータを共有します)。

したがって、すべてのビューには、一種の使用人であるViewModelがあります。;)

この概念を実装しているときに、問題に遭遇しました...少なくとも2つのViewModelが、データベースに保存されているすべての顧客の最近のリストを取得したいとします。

この場合、私は何をしますか?これらのすべてのViewModelに(DRYに対して)このコードを追加する必要があります。

public ObservableCollection<Customer> Customers;

private ObservableCollection<Customer> GetAllCustomers()
{
    var oc = new ObservableCollection<Customer>();

    using (var db = new MyDbContext())
    {
        var query = from b in db.Customers
                    orderby b.Surname
                    select b;

        foreach (var customer in query)
        {
            oc.Add(customer);
        }
    }

    return oc;
}

または(または)FooClass上記と同じコードで静的に作成しますが、静的として歌います。FooClassそのようなものはしばらくすると混乱の大きな山になるので、それはあまり賢くありません。

より賢い解決策は見つかりません。私が巧妙な方法でそれをコーディングする方法をあなたは知っていると確信しています。だから私を助けてください。多くのViewModelに同じ機能を提供するにはどうすればよいですか?

4

1 に答える 1

1

消費するコードのデータアクセスを、特定のデータアクセスや間接参照を可能にするレイヤーに抽象化する必要があります。簡単な内訳は、所有しているカスタムクエリを取得し、それらをオブジェクトに配置して、さまざまなビューモデルでそのオブジェクトを参照することです。

以下は、改善の余地を残しているが、一般的なアイデアを提供する必要がある過度に単純化された例です。viewmodelメソッドが以下のようにどれほど実用的かはわかりませんが、ここでも、述べられたコードの例を提供します。

public class DataAccess {
  public IEnumerable<Customer> GetCustomers() {
    using (var db = new MyDbContext())
    {
        var query = from b in db.Customers
                    orderby b.Surname
                    select b;

        return query.ToList();
    }
  }
}

..。

private ObservableCollection<Customer> GetAllCustomers()
{
    var customers = new DataAccess().GetCustomers();
    return new ObservableCollection<Customer>(customers);
}

この例に加えて、特定のデータセットを処理し、クライアントから渡されたクエリ基準を処理できる集約ルートクラスに分割することをお勧めしDataAccessます。また、コンシューマーがデータエンティティではなくDTOを使用できるようにするなど、他の考慮事項もあります。または、特定のビジネスロジックのドメインオブジェクトとレイヤーも同様です。それの長短は、これが単なるおもちゃ/プロトタイプコードでない限り、ビューモデルから直接EFデータコンテキストにアクセスすることはお勧めしません。

于 2012-11-05T19:12:57.143 に答える