web-dev-qa-db-ja.com

Automapper-なぜMapper.Initializeを使用するのですか?

私は通常ここでこの種の質問をしませんが、残念ながら AutoMapper は良いマッピングライブラリのようですが、そのドキュメントはひどく悪いです-ライブラリのメソッドのXMLドキュメントはありません。私が見つけた最も公式のオンラインドキュメントは this で、これは非常に活発です。誰かがより良いドキュメントを持っているなら、私に知らせてください。

そうは言っても、ここに質問があります:なぜMapper.Initializeを使用するのですか? Mapper.CreateMapをすぐに使用できるため、必須ではないようです。また、ドキュメントがないため、Initializeが何を意味するのかわかりません。

17
Jez

AutoMapperユーザーリストで質問したところ、この回答は基本的に次の理由を示しています。

https://groups.google.com/forum/?fromgroups=#!topic/automapper-users/0RgIjrKi28

これは、AutoMapperが決定論的(確率的)最適化を実行できるようにすることと関係があります。パフォーマンス面では、すべてのマッピングをInitialize呼び出しで作成することをお勧めします。

9
Jez

初期化はすべてのマップ作成を一度実行するので、マッピングを行うときに実行されます。いつでもマップを作成できますが、マッピングの作成にはリフレクションが含まれるため、コードの速度が低下します。

マッピングコードにプロファイルを使用し、次のようなものを使用してこれをすべてセットアップするのが最善だと思います。

public class AutoMapperConfiguration : IRequiresConfigurationOnStartUp
{
    private readonly IContainer _container;

    public AutoMapperConfiguration(IContainer container)
    {
        _container = container;
    }

    public void Configure()
    {
        Mapper.Initialize(x => GetAutoMapperConfiguration(Mapper.Configuration));
    }

    private void GetAutoMapperConfiguration(IConfiguration configuration)
    {
        var profiles = GetProfiles();
        foreach (var profile in profiles)
        {
            configuration.AddProfile(_container.GetInstance(profile) as Profile);
        }
    }

    private static IEnumerable<Type> GetProfiles()
    {
        return typeof(AutoMapperConfiguration).Assembly.GetTypes()
            .Where(type => !type.IsAbstract && typeof(Profile).IsAssignableFrom(type));
    }
}
7
Rob West