2010-12-16 12 views
1

AutoMapperを使用したアーキテクチャ?私は、次のフローを使用してASP.NET MVCアプリケーションを構築してい

コントローラ

  • でエンティティ

    1. 実行アクション(モデルに対して動作FactoryClassからデータを取得する取得しますエンティティフレームワーク)
    2. コントローラのアクションにデータを戻す
    3. AutoMapperを使用して、ModelオブジェクトからModelViewオブジェクトに変換する
    4. リターンのModelViewオブジェクト強く型付けされたビュー

    に更新エンティティ

    1. 入力としてのModelViewエンティティ(DefaultDataBinderが使用されます)
    2. 検証のModelViewエンティティ
    3. とファイル名を指定して実行アクション右のファクトリメソッドに直接ModelViewオブジェクトを送ります。
    4. ModelViewオブジェクトにidがあるかどうかチェックし、そうであればModelオブジェクトをデータベースから取得します。
    5. AutoMapperを使用して、着信するModelViewオブジェクトをModelオブジェクト/エンティティに変換します。その更新の場合は、フェッチされたModelオブジェクトを宛先として使用します。
    6. 更新を使用する場合Refresh Client.Wins elseを使用します。追加
    7. SaveChangesを実行し、コントロールに戻ります。

    問題1

    のModelViewクラスは、(それがedetingオブジェクトとリストの両方を含めることができます)のcontrolerアクションが接続されているビューのために作られた特別なものです。異なるビューを持ついくつかのアクションは、同じModelViewクラスを使用するため、ModelViewオブジェクトのすべてのオブジェクトがすべてのアクション/ビューで使用されるわけではありません。

    限り、ビューを更新することができModelViewObjectsのすべてのプロパティを使用しても問題ないけど...

    は、この、我々はModelViewObjectのプロパティの一部が使用されていないビューを得たことを言いますModelViewObjectは、(対応するModelObjectが(db/entityフレームワークから)フェッチされ、AutoMapperでModelViewObjectとマージされる)ファクトリに送信されます(更新されます)。ここで問題となるのは、設定されていない(ビューで使用されていない)ModelViewObjectのプロパティは、ModelObjectの実データを上書きすることになります。

    これを解決するには、通常、AutoMapper ForMember Ignor()を使用しますが、これは完全なModelViewObject(すべてのプロパティセット)がdbを更新するときに問題になります。

    これはどのように処理しますか? AutoMapperの設定が異なる工場で異なる更新方法がありますか?

    私は次のようなメソッドしか持つことができませんでした:UpdateMyEnityt(MyEntityエンティティ)とこのmethidはoch add MyEntityオブジェクトを更新します。私はAutoMapperマッピングを置くべき

    問題2

    ?今のところ私はアップデートをに、に入れました。私はModelViewObjectにModelViewObject.ToDataModelのようなマッピングを配置することを考えましたが、完全な変換(somプロパティは無視される)が必要ない場合は、このAutoMapperをどこかで実行する必要があります。

    これはどのように処理しますか?

    問題3

    はあなたがのModelView(エンティティフレームワークオブジェクト)にModelViewObjectを翻訳したSOM ignorsでAutoMapperを使用し、当社のファクトリクラスで作業updateメソッドを持っていると言います。このテーブルに対応するModelViewObjectを処理するビューを実行するが、新しいプロパティを処理しないビューを実行すると、プロパティが常にnull/stringに設定されることを意味するので、データベーステーブルを新しいフィールド/ propertieで更新するとします。空/ 0。ファクトリで定期的な更新メソッドを実行するとき、このプロパティに無視されません。これは、ゼロ値が実際の値を上書きすることを意味します。

    このような更新が行われる大きなリスクと、古いコードでこれを処理することを覚えていない大きなリスクです。

    どうすれば対応できますか?

    問題4 AutoMapperは私がmaby検証他のいくつかの方法でこれを置く必要があり、今私は、マッピングが行われているこれらの検証を持っています、マッピングが可能になるかどうかをチェックすることができます検証メソッドを持っていますアプリケーションが起動するのと同じ速さで実行されますか?機能を使用するときは、マッピングのその他の問題が最初に表示されます。

    BestRegards

  • +5

    それのMVC世話しましょう - 段落をまとめた検討 - これはQ&フォーラムですが、エッセイライティングではありません。 :) – RPM1984

    +0

    Yhea私は知っているが、私はそれをより短く保つために問題を抱えている。 – Banshee

    答えて

    4

    まず、ビューごとにviewModelを使用する必要があります。必要な日付だけを取得します。 「難しい」問題のマニュアルマッピングに機能を追加する必要があります。 AutoMapperがDbオブジェクトからViewオブジェクトへの転送日時に間違っているということです。

    +0

    ありがとうございます。しかし、ビューごとにViewModelを使用し、マニュアルマッピングを使用することにしたとしても、ビジネスエンティティが新しい/変更されたプロパティでデータベースから更新されると、常に問題が発生します。アプリケーションが大きい場合は、壊れたマッピングが簡単であるとは思わないかもしれません。これは、同じビジネスエンティティを使用するいくつかのビューが長い間、長い間続いています。 – Banshee

    +0

    複雑なクラスMyFiltersを含むビューがPage1に必要であるとすれば、このクラスには多くのパラメータが含まれています。私のPage2もこのクラスが必要です。両方のビューに同じクラスを広告するのは間違っていますか?そうでない場合は、多かれ少なかれ同じことを行う余分なコードがたくさんあります。 – Banshee

    +0

    同じコントロールが別のページにある場合は、ViewModelをUI.soでデザインする必要があります。同じviewModelを使用する必要があります。同様のプロパティを持つPage1とPage2 MyFilterは、私たちのページのビューモデルです。 –

    1

    問題1:別のViewを使用している場合は、別のViewModelを使用します。この方法では、表示されるプロパティのみが自動的に処理されます。

    問題2:Global.asaxのまたは類似のエントリポイントで

    Project1.AutomapperSettings.Execute(); 
    Project2.AutomapperSettings.Execute(); 
    

    など

    各プロジェクトにおける異なるAutomapper設定。

    問題3:参照してください。問題1

    問題4:使用のviewmodelの性質上ValidationAttributeと、この質問ではあまりあり

    +0

    問題1:音が良い、問題2:これを説明すると、Mapper.CreateはMapper.AssertConfigurationIsValid(); Gloval.asaxからrunnedする必要がありますか?問題3:私は参照してください問題4:エンティティの検証は、Mapperのvaldiation(Mapper.AssertConfigurationIsValid();)について話していない – Banshee

    +0

    複雑なクラスMyFiltersを含むビューが必要な、このクラスは、パラメータの多くが含まれていると言う。私のPage2もこのクラスが必要です。両方のビューに同じクラスを広告するのは間違っていますか?そうでない場合は、多かれ少なかれ同じことを行う余分なコードがたくさんあります。 – Banshee

    +0

    問題2:AutoMapperマッピングは、アプリケーションがロードされるときに作成する必要があります。これらのマッピングは静的クラスに属し、アプリケーションの存続期間中存続するためです。 問題4:Mapper.AssertConfigurationIsValid();あなたのアプリケーションロジックafaikの一部としてではなく単体テストで実行されるべきです。 コメント2:ViewModel1をModelとViewModel2にマップして、ViewModelsのモデル化と継承を検討してください。それ以外の場合は、ViewModelをモデルのフィルタリングや再構成に使用しないので、ViewModelsを完全に削除することもできます。 – Kaido

    関連する問題