我在我的应用程序中使用最新版本的Automapper,以及Autofac。我设置了配置和配置文件,并使用name
对我的所有配置文件进行了单元测试,一切正常。
但是,当我使用mapper时
在我的应用程序中,只有从代码运行时才会得到div
异常,我怀疑这与我如何设置映射器以使用Autofac有关:
AssertIsConfigurationValid()
我正在尝试在我的应用程序中将"Automapper missing type map configuration or unsupported mapping"
映射到 // This is how I register my mapper with Autofac
public class ModelsMapperModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterAssemblyTypes().AssignableTo(typeof(Profile)).As<Profile>();
builder.Register(c => new MapperConfiguration(cfg =>
{
foreach (var profile in c.Resolve<IEnumerable<Profile>>())
{
cfg.AddProfile(profile);
}
})).AsSelf().SingleInstance();
builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)).As<IMapper>().InstancePerLifetimeScope();
}
}
// Here is a simple version of my objects and mappings:
public class LetterDomain
{
public List<StationDomain> Stations {get; set;}
public string Title {get; set;}
public int Id {get; set;}
public int TimeCreated {get; set;}
public string File {get; set;}
public bool IsSecret {get; set;}
}
public class StationDomain
{
public int Id {get; set;}
public string Owner {get; set;}
public string Name {get; set;}
}
public class LetterDto
{
public DestinationDto Dest {get; set;}
public int Id {get; set;}
}
public class DestinationDto
{
public List<StationDto> Stations {get; set;}
}
public class StationDto
{
public string Name {get; set;}
}
public class MyProfile : Profile
{
protected override void Configure
{
CreateMap<StationDomain, StationDto>()
CreateMap<LetterDomain, DestinationDto>();
CreateMap<LetterDomain, LetterDto>()
.ForMember(x => x.Dest, opt => opt.MapFrom(src => Mapper.Map<DestinationDto>(src)));
}
}
public void MyMethodInsideApplication(LetterDomain letter)
{
// Exception is thrown here
var dto = _mapper.Map<LetterDto>(letter);
}
,它告诉我LetterDomain
到LetterDto
的配置缺失,尽管我确实创建了映射..
在这里真的想要一些帮助..
提前致谢!
编辑: 我只想添加所有其他不使用静态Mapper.Map&lt;&gt;的映射。在他们的配置文件中,在应用程序中工作良好
答案 0 :(得分:0)
一个问题是,您没有指定从.
.
.
<ASIMD instruction>
<ASIMD instruction>
<ASIMD instruction>
<Data MOV between ASIMD vectors and ARM Reg>
<ARM assembly instruction> ------- <ASIMD instruction>
<ARM assembly instruction> ------- <ASIMD instruction>
<ARM assembly instruction> ------- <ASIMD instruction>
<Data MOV between ARM Reg and ASIMD vectors>
<ARM assembly instruction> ------- <ASIMD instruction>
<ARM assembly instruction> ------- <ASIMD instruction>
<ARM assembly instruction> ------- <ASIMD instruction>
.
.
.
到DestinationDto.Name
的映射时应填充LetterDomain
的方式。
换句话说,DestinationDto
没有LetterDomain
属性,因此该属性不可能自动映射。
答案 1 :(得分:0)
我猜你不能同时使用映射器的静态和非静态版本(除非你创建静态和非静态映射,但是没用);顺便说一下,你不需要使用
CreateMap<LetterDomain, LetterDto>()
.ForMember(x => x.Dest, opt => opt.MapFrom(src => Mapper.Map<DestinationDto>(src)));
应用地图,只需
CreateMap<LetterDomain, LetterDto>()
.ForMember(x => x.Dest, opt => opt.MapFrom(src));
如果存在,地图将自动应用。
如果需要,您还可以稍微简化映射过程:
protected override void Load(ContainerBuilder builder)
{
var profiles =
from t in typeof (MapperModuleRegistration).Assembly.GetTypes()
where typeof (Profile).IsAssignableFrom(t)
select (Profile) Activator.CreateInstance(t);
var config = new MapperConfiguration(cfg =>
{
foreach (var profile in profiles)
{
cfg.AddProfile(profile);
}
});
builder.RegisterInstance(config).As<MapperConfiguration>();
builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper()).As<IMapper>();
}
希望有所帮助:)
答案 2 :(得分:0)
就我而言,我的映射配置文件存在于其他任何项目未引用的单独的dll中。通过添加对我的映射配置文件.dll的引用,它解决了我的问题。