17

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

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

4

2 に答える 2

9

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

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

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

于 2012-10-22T14:23:19.233 に答える
7

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

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

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));
    }
}
于 2012-10-19T15:34:19.620 に答える