将AutoMapper注入其他图层的正确方法是什么?
我阅读了此博客post,但此代码导致
下面的例外AutoMapper.dll中出现“AutoMapper.AutoMapperMappingException”类型的异常,但未在用户代码中处理
在服务层尝试映射时。
List<StudentViewModel> list2 = _mapper.Map<List<StudentViewModel>>(list);
我的AutoFac配置如下:
public static class DependencyRegistration
{
public static void Config()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterType<TypeMapFactory>().As<ITypeMapFactory>();
builder.RegisterType<ConfigurationStore>().As<ConfigurationStore>().WithParameter("mappers", MapperRegistry.Mappers).SingleInstance();
builder.Register((ctx, t) => ctx.Resolve<ConfigurationStore>()).As<IConfiguration>().As<IConfigurationProvider>();
builder.RegisterType<MappingEngine>().As<IMappingEngine>();
//...
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
}
答案 0 :(得分:3)
您似乎需要使用容器中注册的IConfiguration
对象来创建这样的地图:
var configuration = container.Resolve<IConfiguration>();
configuration.CreateMap<Student, StudentViewModel>();
我认为您应该在申请开始时这样做。
以下是使用Config
方法配置内容的更好方式(IMO):
public static void Config()
{
var configuration_store = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
var mapping_engine = new MappingEngine(configuration_store);
configuration_store.CreateMap<Student, StudentViewModel>();
var builder = new ContainerBuilder();
builder.RegisterInstance(mapping_engine).As<IMappingEngine>();
//...
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
我在上一个示例中假设您的类只需要访问IMappingEngine
(而不是IConfiguration
),因为您应该已经在Config
方法中设置了所有映射(或者应用程序启动时的其他一些配置方法。)
答案 1 :(得分:2)
.netcore 3 Autofac 5.1.2 AutoMapper 9.0.0 AutoMapperProfiles->我的个人资料名称
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<AutoMapperProfiles>().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();
}