11

私は頻繁に AutoMapper を使用して、Model (Domain) オブジェクトを ViewModel オブジェクトにマップします。これらのオブジェクトは、Model/View/View-Model パターンでビューによって使用されます。

これには多くの「Mapper.CreateMap」ステートメントが含まれます。これらはすべて実行する必要がありますが、アプリケーションのライフサイクルで一度だけ実行する必要があります。

技術的には、Application_Start() メソッド (これは ASP.NET MVC アプリケーションです) から呼び出される静的メソッドにすべてを保持する必要があります。

ただし、多くの異なるマッピングの問題を 1 つの中心的な場所にグループ化するのは間違っているようです。

特に、マッピング コードが複雑になり、書式設定やその他のロジックが関係する場合は特にそうです。

関連する ViewModel の近くに保持されるようにマッピング コードを整理するより良い方法はありますか?

(私は 1 つのアイデアを思いつきました。各 ViewModel に 'CreateMappings' メソッドを配置し、BaseViewModel でインスタンス化時にこのメソッドを呼び出すことです。ただし、このメソッドはアプリケーションのライフサイクルで1 回しか呼び出されないため、追加のロジックが必要です。 CreateMappings メソッドが呼び出された ViewModel タイプのリストをキャッシュし、そのリストにない ViewModel に対して必要な場合にのみ呼び出します。)

4

3 に答える 3

3

プロファイルを使用する場合、すべての「CreateMap」呼び出しをそこに配置できます。さらに、構成を含む静的なブートストラップ クラスを作成し、スタートアップ ピースでブートストラップを呼び出すだけにすることもできます。

于 2010-05-23T21:48:09.833 に答える
0

OK、私が現在行っている方法は次のとおりです。

「CreateMappings」メソッドを実行する BaseController のコンストラクターにいくつかのロジックを追加しますが、コントローラー タイプごとに 1 回だけです。

public abstract class BaseController : Controller
{    
    public BaseController()
    {
        if (!controllersWithMappingsCreated.Contains(GetType()))
        {
            CreateMappings();
            controllersWithMappingsCreated.Enqueue(GetType());
        }
    }

    protected virtual void CreateMappings() { }
}

各具象コントローラーで、CreateMappings を使用して、そのコントローラーに関連するすべてのモデル/ビューモデルのマッピングを宣言します。

public class AccountController : BaseController
{
    public AccountController() : base() { }

    protected override void CreateMappings()
    { 
        Mapper.CreateMap<Models.User, ViewModels.UserProfile>();
        Mapper.CreateMap<Models.User, ViewModels.ChangePassword>();
    }
}

Attributes herehereを含むいくつかの興味深い代替案も見つけましたが、少し複雑すぎると思います。

于 2010-05-24T00:59:10.983 に答える