2

Webサービスがあります。

  • タイプZooとを提供しますAnimal
  • Zoo動物のIDと名前の辞書があります。
  • Animalプロパティがあります:Id、、。Name(additional stuff)
  • GetZoozooオブジェクトを返すメソッドがあります。
  • 、、およびを含むオブジェクトをGetAnimalStuffById返すメソッドがあります。AnimalIdName(additional stuff)

つまり、アイデアは-GetZoo動物ID +名前のリストを取得し、GetAnimalStuffById完全な動物情報を取得できるようにすることです。

VSでそのサービスに「サービス参照」を追加し、MVVMアプリを作成したいと思います。私が完全に理解しておらず、洗脳する必要があるいくつかの事柄。

  1. 自動生成されたクラスが私のモデルになっても大丈夫ですか?

  2. 例とは関係ありませんが、とにかく、サービス参照を追加するときにどの「コレクションタイプ」を指定する必要がありますか?ObservableCollectionモデルにとってやり過ぎで悪い習慣ですか?

  3. たとえば、ユーザーは完全な動物情報を表示するアプリケーションページに移動します。明らかに、最初はAnimalViewModelwith onlyIdNamevalues(から取得GetZoo)があります。ページに移動すると、すべてのデータを含むオブジェクトを呼び出しGetAnimalStuffByIdて取得します。Animal次に何をすればいいですか?ビューのDataContextをAnimalViewModel新しいオブジェクトから作成された新しいAnimalものに置き換えますか(A)、または単にその中の値を置き換えます(B)?

  4. 答えが(A)の場合、すべてのビューでDataContextを置き換えるにはどうすればよいですか?

  5. 答えが(B)の場合、その更新の原因は何ですか?VMは、Animal更新の取得に関するファンシーマネージャーのイベントにサブスクライブする必要がありますか?または他のアプローチはありますか?

  6. INotifyPropertyChanged自動生成されたクラスの目的は何ですか?私の場合、それらは常にWebサービスから新鮮に返されます。マイクロソフトは、いくつかのシナリオでそれらをViewModelとしても使用することを提案していますか?

ありがとう。

4

2 に答える 2

1

MVVMでの私自身の経験に基づいたいくつかの回答があります(これは「ベストプラクティス」である場合とそうでない場合があります。)

  1. 絶対!すべてを2回行う必要はありません-#5と#6を参照してください(ここで同意しない人もいますが)。

  2. はい、実際にサーバー側の機能が必要でない限り、ObservableCollectionそれはやり過ぎであり、他の人を混乱させる可能性があると思います。技術的には、ネットワークを介して送信されるメッセージにオーバーヘッドはありませんが、配列などのより単純なものを使用します。

  3. オプションBを使用します。

  4. -

  5. たとえばAnimalViewModel、追加のものをすべて保持する単一のプロパティを自分の中に持つことができますpublic Animal AdditionalData { ...。これで、呼び出す人は誰でもGetAnimalStuffById、現在のViewModelのAdditionalDataをそのAnimalオブジェクトで更新できます。

  6. 一部のデータがどこかで変更されたことをビューに通知するために、それが存在することをすでに知っていると思いますINotifyPropertyChanged(そうでない場合は、「inotifypropertychangedmvvm」をグーグルで検索すると開始できます)。これで、#1と#5のドットを接続すると、ViewModelですべてを再作成しなくても、AdditionalDataプロパティを通過することで、ビューを動物の追加データにバインドできるようになります<TextBox Text="{Binding Path=AdditionalData.HeightOrWhatever}" />

注:ビューがWPFまたはSilverlightでない場合、その最後のポイントはあまり意味がありません。

于 2013-01-13T10:37:29.807 に答える
1

そして、ここに私の経験に基づいた答えがあります(主に別の視点を提供するために)

  1. Modelsエンドポイントから自動生成するのは問題ありません。Modelsしかし、私は何の問題もなくPOCOをお勧めしINPCます。2つの理由は、a)保守がより簡単で簡単になること、およびb)に直接Modelsさらされたくない、またはそうすると正しく機能しないことです。ModelsView

  2. ObservableCollection#1から続けて、では使用しませんModels。繰り返しますが、物事を単純に保ち、にModels直接提示することを避けるためViewです。

  3. オプション(B)

  4. -

  5. のすべてのプロパティはViewModelINPCを実装する必要があります。次に、それらを変更すると、バインディングが自動的に更新されます。データをフラット化するAdditionalDataプロパティとしてすべての値を設定することも、追加のデータを保持するオブジェクトを作成することもできます。AutoMapperValueInjecterなどのマッピングツールの使用を検討するために、オブジェクトからデータをマッピングします。AnimalViewModelAdditionalDataViewModelAdditionalDataAdditionalDataViewModel

  6. INPC自動生成装置がモデルに何かを追加した理由はわかりません。どのツールを使用していますか?いずれにせよ、私が言ったように、私はにいること、またはにさらすことはINPCお勧めしません。代わりに、からにマッピングし、にのみ公開する必要があります。ModelsModelsViewModelsViewModelsViewModelsView

于 2013-01-15T09:11:40.163 に答える