我必须投射 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 上的映射器将按预期工作。这让我觉得我们只是以某种方式使用一个实例。你能帮助我在这两个项目上有两个不同的实例吗?
答案 0 :(得分:0)
您在应用程序中两次调用Mapper.Initialize()
,每个项目调用一次,因此一个覆盖另一个,这就是为什么它在您对项目中的Mapper.Initialize()
进行评论时的工作原理 A 它有效,因为它会停止覆盖 B&#39> 配置。
解决此问题的一个方法是让 B 调用 A Configure
,然后像这样注入其个人资料:
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
。
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
,因为我不确定具有相同名称的个人资料是否会造成任何问题。