web-dev-qa-db-ja.com

Automapperは、Mapper.Mapは時代遅れのグローバルマッピングだと言っていますか?

プロジェクトで、コードでMapper.Map<targetType>(sourceObject);を使用できるようにするグローバルAutomapper構成を定義しました。 (以下の私の構成を参照してください。)

NuGetパッケージを更新しましたが、Mapper.Mapが廃止/減価償却されているというメッセージが表示されます。 GitHubのAutomapperに戻り、次のような例を確認しました。

[Test]
public void Example()
{
    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<Source1, SubDest1>().FixRootDest();
        cfg.CreateMap<Source2, SubDest2>().FixRootDest();
    });

    config.AssertConfigurationIsValid();

    var mapper = config.CreateMapper();

    var subDest1 = mapper.Map<Source1, SubDest1>(new Source1 {SomeValue = "Value1"});
    var subDest2 = mapper.Map<Source2, SubDest2>(new Source2 {SomeOtherValue = "Value2"});

    subDest1.SomeValue.ShouldEqual("Value1");
    subDest2.SomeOtherValue.ShouldEqual("Value2");
}

マッピングを使用するすべての方法で構成を作成する必要がありますか?

私の現在のグローバル構成:

namespace PublicationSystem.App_Start
{
    public class AutoMapperConfig
    {
        public static void CreateMaps()
        {
            CreateProjectMaps();
        }

        private static void CreateProjectMaps()
        {
            Mapper.CreateMap<Project, ProjectCreate>();
            Mapper.CreateMap<Project, ProjectSelectable>();
            //...
        }
    }
}

UPDATE: Scott Chamberlainのコーチングのおかげで、次のようなクラスを作成しました。

    public class MkpMapperProfile : AutoMapper.Profile
    {
        protected override void Configure() 
        {
            this.CreateMap<Project, ProjectCreate>();

            this.CreateMap<Project, ProjectSelectable>();

            this.CreateMap<Project, ProjectDetails>();

            // Many Many other maps
        }
    }

BaseControllerクラスに「MapperConfiguration」が必要だと思っています。私はこのようなことを始めました:

public partial class BaseController : Controller
{

    private MapperConfiguration mapConfig;

    public BaseController()
    {
        db = new MkpContext();
        SetMapperConfig();
    }

    private void SetMapperConfig()
    {
        mapConfig = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile<MkpMapperProfile>();
            });
    }

    public BaseController(MapperConfiguration config)
    {
        db = new MkpContext();
        this.mapConfig = config;
    }
}

私は正しい軌道に乗っていますか?

25
M Kenyon II

これは私がそれを処理した方法です。

Mapperの同じ名前の静的メソッドではなく、ProfileのCreateMapメソッドを使用するように注意して、プロファイルにマップを作成します。

internal class MappingProfile : Profile
{
    protected override void Configure()
    {
        CreateMap<Project, ProjectCreate>();
    }
}

次に、依存関係が関連付けられている場所(例:Global.asaxまたはStartup)で、MapperConfigurationを作成し、それを使用してIMapperを作成します。

var mapperConfiguration = new MapperConfiguration(cfg =>
    {
        cfg.AddProfile(new MappingProfile());
    });

次に、構成を使用してIMapperを生成します。

var mapper = mapperConfiguration.CreateMapper();

次に、そのマッパーを依存関係ビルダーに登録します(ここではAutofacを使用しています)

builder.RegisterInstance(mapper).As<IMapper>();

さて、どこにマップする必要がある場合でも、IMapperへの依存関係を宣言します:

internal class ProjectService : IProjectService {
    private readonly IMapper _mapper;
    public ProjectService(IMapper mapper) {
         _mapper = mapper;
    }
    public ProjectCreate Get(string key) {
        var project = GetProjectSomehow(key);
        return _mapper.Map<Project, ProjectCreate>(project);
    }
}
39
Romi Petrelis

バージョン5.2.0を使用しています。configureをオーバーライドする代わりに、コンストラクターでマップを作成することをサポートしています。

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Project, ProjectDto>();
    }
}

Global.asax.csで次のように呼び出します。

Mapper.Initialize(c=>c.AddProfile<MappingProfile>());

この助けを願っています。

11
zquanghoangz

これはAutoMapper 4.2の新機能です。これに関するジミーボガードによるブログ投稿があります: AutoMapperから静的APIを削除する 。それが主張する

IMapperインターフェースははるかに軽量であり、基礎となる型はマップの実行にのみ関心を持ち、多くのスレッドの問題を取り除きます...

新しい構文:(ブログ投稿から貼り付け)

var config = new MapperConfiguration(cfg => {
  cfg.CreateMap<User, UserDto>();
});

これを行う「古い方法」が必要な場合。最新のバージョン4.2.1は伝統を復活させました。ただ使う

CreateMap<Project, ProjectCreate>();

の代わりに

Mapper.CreateMap<Project, ProjectCreate>();

古いコードは問題なく動作します。

7
Blaise
2
Nikolay Kostov
Mapper.Initialize(cfg => {
    cfg.CreateMap<Source, Dest>();
});
1
Roberth Solís