c# - Automapper 说 Mapper.Map 已过时,全局映射?

标签 c# automapper

我在我的项目中定义了一个全局 Automapper 配置,它允许我使用 Mapper.Map<targetType>(sourceObject);在我的代码中。 (请参阅下面我的配置。)

我更新了 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>();
            //...
        }
    }
}

更新:感谢 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;
    }
}

我走在正确的轨道上吗?

最佳答案

我就是这样处理的。

在 Profile 中创建 map ,注意使用 Profile 的 CreateMap 方法而不是 Mapper 的同名静态方法:

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);
    }
}

关于c# - Automapper 说 Mapper.Map 已过时,全局映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35370732/

相关文章:

c# Group 然后排序元组列表 <T1,T2,T3>

c# - 微软同步框架日期时间问题

c# - 在类库中使用 Automapper 进行 Ninject

c# - 按照惯例使用 AutoMapper 将 Wrapper<T> 映射到 T'

c# - session 过期后从数据库中删除它吗?

c# - 扩展执行 session : Can we run UWP like Desktop app without Suspending?

c# - 在哪里放置代码以将用户重定向回页面直到谓词为真?

entity-framework - 如何使用 AutoMapper 将 DTO 映射到 Entity Framework 代理类?

nhibernate - 在不触发延迟加载或急切加载的情况下将 NHibernate POCO 复制到 DTO

c# - 使用 AutoMapper 将字符串列表映射到对象列表