自动映像不能使用多个配置文件,只能使用一个

时间:2017-03-09 22:21:11

标签: asp.net-mvc automapper

我必须投射 A B 。他们都添加了Automapper。 B 引用 A 。它们中的每一个都具有如下配置的Automapper:

B:

public static class AutoMapperConfiguration
    {
        public static void Configure()
        {
            Mapper.Initialize(cfg =>
            {
                cfg.AddProfile(new UserProfile());
            });
        }
    }

    public class UserProfile : Profile
    {
        public UserProfile()
        {
            CreateMap<UserDto, UserVm>();
            CreateMap<NewUserVm, NewUserDto>();
        }
    }

A:

public class AutoMapperConfig
    {
        public static void Configure()
        {
            Mapper.Initialize(cfg =>
            {
                cfg.AddProfile(new UserProfile());
            });
        }
    }

    public class UserProfile : Profile
    {
        public UserProfile()
        {
            CreateMap<User, UserDto>();
            //CreateMap<NewUserVm, NewUserDto>();
        }
    }

我启动该项目, B 调用 A 。它转到 A ,返回,当尝试在B本身上进行映射时,它表示没有为&#34; CreateMap&lt; UserDto,UserVm&gt; ();&#34 ;.如果我从 A 中删除配置但未使用它,则 B 上的映射器将按预期工作。这让我觉得我们只是以某种方式使用一个实例。你能帮助我在这两个项目上有两个不同的实例吗?

1 个答案:

答案 0 :(得分:0)

您在应用程序中两次调用Mapper.Initialize(),每个项目调用一次,因此一个覆盖另一个,这就是为什么它在您对项目中的Mapper.Initialize()进行评论时的工作原理 A 它有效,因为它会停止覆盖 B&#39> 配置。

解决此问题的一个方法是让 B 调用 A Configure,然后像这样注入其个人资料:

重新配置A以允许传递自定义配置

public class AutoMapperConfigForProjectA
{
    public static void Configure(Action<IMapperConfiguration> configuration = null)
    {
        Mapper.Initialize(cfg =>
        {
            cfg.AddProfile(new UserProfile());
            // if any callback config is passed, call it...
            if (configurations != null)
                configuration(cfg);
        });
    }
}

public class UserProfile : Profile
{
    public UserProfile()
    {
        CreateMap<User, UserDto>();
        //CreateMap<NewUserVm, NewUserDto>();
    }
}

我刚刚在项目A 中将AutoMapperConfig重命名为AutoMapperConfigForProjectA

在项目B中调用AutoMapperConfigForProjectA.Configure(),添加自己的配置

public static class AutoMapperConfiguration
{
    public static void Configure()
    {
        AutoMapperConfigForProjectA.Configure(cfg =>
        {
            cfg.AddProfile(new UserProfileForB());
        });
    }
}

public class UserProfileForB : Profile
{
    public UserProfileForB()
    {
        CreateMap<UserDto, UserVm>();
        CreateMap<NewUserVm, NewUserDto>();
    }
}

我还在项目B中将UserProfile重命名为UserProfileForB,因为我不确定具有相同名称的个人资料是否会造成任何问题。