2016-09-29 11 views
6

まだ私の最初のUWP/MVVM/EFコアアプリケーションで作業しています。ビューモデルからレコードを更新する正しい方法は何ですか?

私のビューモデルにDbContextについての知識を持たせたくありません。だから私は、私のビューモデルに注入、次のItemServiceクラスを作成しました。

public class ItemService : IItemService 
{ 
    public async Task SaveAsync(Item item) 
    { 
     using (var db = new MyDbContext()) 
     { 
      db.Items.Add(item); 
      await db.SaveChangesAsync(); 
     } 
    } 
} 

私ItemViewModelは、次のコマンドが含まれています。私はアイテムを保存するとき

public RelayCommand SaveCommand { get; private set; } 

private async void Save() 
{ 
    if (!SaveCommand.CanExecute(Item)) 
     return; 

    await ItemService.SavAsync(Item); 
} 

これは素晴らしい作品。 SaveAsyncメソッドは、DbContextの新しいインスタンスを作成し、作成したばかりのアイテムを追加してから、その変更をデータベースにコミットします。

私の質問は、既存のレコードの更新についてです。私はこのようなことについて考えています:

public class ItemService : IItemService 
{ 
    public async Task UpdateAsync(Item item) 
    { 
     using (var db = new MyDbContext()) 
     { 
      Item dbItem = (from i in db.Items 
          where i.Id = item.Id 
          select i).FirstOrDefault(); 

      // Here I should duplicate all the item's properties into dbItem ones 

      await db.SaveChangesAsync(); 
     } 
    } 
} 

私はこの解決法が嫌いです! dbItemにitemのすべてのプロパティをコピーする必要があります。もし私が忘れたら?私はICloneableを実装することができますが、私は本当にすべてのエンティティに対してそれを行うオーバーヘッドを見つける。

ここで正しいパターンは何ですか。ビューモデルによって管理されるレコードを更新する最善の方法は?事前に

多くのおかげで、 ジュリアン

+0

私はほとんど「良い」方法を見ていません。すべてのプロパティをチェックして、変更されていないプロパティを書き換えないようにすることはできますが、それでもある時点ですべてのプロパティを処理する必要があります。 – Kilazur

+0

Automapper http://automapper.org/を使ってマッピングの問題を回避することができます – Rohit

+0

Automapperは怪物の最後の避難所です。それを使用しないでください。そしてあなたの本当の疑問は、「EFコアで切り離されたモデルをどのように更新するのですか?実際にはwpfやmvvmとは関係ありません。 – Will

答えて

0

は、あなたが完全にViewmModels.Onから、あなたがするのViewModelをマップするためにAutoMapperを使用することができ、サービス層を、あなたのDALの層を分離さことができますapp.Then上のリポジトリのパターンを使用する必要がありますエンティティとその逆。この瞬間にあなたはあなたのサービス層でそれを行うことができます。しかし、リポジトリパターン(すなわちDAL)のために依存性注入を別々のレイヤーに導入する必要があります。そのため、VMのミックスについて心配する必要はありません上記のパターンを実装すると、言い換えると2つのレイヤーに分かれています。

EFコアを使用しているため、AutofacをDI APIとして使用できます。

AutoMapperとは何ですか? オブジェクトを別のオブジェクトにマッピングされたコードを取り払う -

AutoMapperは一見 複雑な問題を解決するために構築されたシンプルで小さなライブラリです。このタイプのコードはかなり面倒で、書くのに退屈なので、 なぜ私たちのためにそれを行うツールを発明しないのですか?ここで

リンクです:あなたはあまりにもその.see Prismを使用することができます@Sean Staynによって示唆されるようにGeneric Repository and Unit of Work Pattern, Entity Framework,Autofac

AutoMapper

良い記事。

プリズムが疎結合を構築するためのフレームワーク、保守、およびWPFはWindows 10 UWP、及びXamarinフォームで テスト可能XAMLアプリケーションです。

+0

AutoFacとDependency Injectionを使用する場合は、UWP用にPrism 6をお勧めします。 DIとUWPで始めることは非常に役に立ちます! –

+0

私はあなたと同意しません。それはOPからです。私はdbItemにitemのすべてのプロパティをコピーする必要があります。 'Automapper'は自分が必要とすることをやります。Automapperを正しく設定すると、マップするプロパティを決して忘れることはありません:D @Will – Sampath

+0

Aaah、私は参照していますあなたはそこから来ています。しかし、彼がしなければならないことは、モデルを再取り付けして、変更したものとしてマークすることだけです。新しい依存関係をインポートするよりもはるかに簡単です。しかし、それは一つの解決策です。 – Will

関連する問題