C# 使用Automapper静态初始化API放置映射的位置
我正在使用Automapper 6.2.2,我正在尝试在Web应用程序中设置它。我试图使用直接放在Global.asax文件中的staticC# 使用Automapper静态初始化API放置映射的位置,c#,asp.net,automapper,C#,Asp.net,Automapper,我正在使用Automapper 6.2.2,我正在尝试在Web应用程序中设置它。我试图使用直接放在Global.asax文件中的staticAutomapper.Initialize()方法 public class WebApiApplication : HttpApplication { protected void Application_Start() { AutoMapper.Mapper.Initialize(cfg => {
Automapper.Initialize()
方法
public class WebApiApplication : HttpApplication
{
protected void Application_Start()
{
AutoMapper.Mapper.Initialize(cfg =>
{
cfg.AllowNullCollections = true;
cfg.CreateMap<LoadArea, LoadAreaWithoutPlannedSlotDto>();
cfg.CreateMap<LoadArea, LoadAreaDto>();
cfg.CreateMap<LoadAreaForCreationDto, LoadArea>().Ignore(d => d.Slots);
cfg.CreateMap<LoadArea, LoadAreaForUpdateDto>();
cfg.CreateMap<LoadAreaForUpdateDto, LoadArea>().ForMember(m => m.Code, i => i.UseDestinationValue());
cfg.CreateMap<PlannedSlot, PlannedSlotDto>();
cfg.CreateMap<PlannedSlotForCreationDto, PlannedSlot>().Ignore(d => d.Area);
cfg.CreateMap<PlannedSlotForUpdateDto, PlannedSlot>();
cfg.CreateMap<UserToReturnDto, User>();
cfg.CreateMap<LoadAreaSlotDetailForReturnDto, LoadAreaSlotDetail>();
});
AreaRegistration.RegisterAllAreas();
UnityConfig.RegisterComponents();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
还尝试:
cfg.CreateMap<LoadAreaSlotDetailForReturnDto, LoadAreaSlotDetail>(MemberList.None);
cfg.CreateMap(MemberList.None);
以及其他一些组合,包括忽略所有未映射成员的扩展方法:
public static IMappingExpression<TSource, TDestination> Ignore<TSource, TDestination>(this IMappingExpression<TSource, TDestination> map,
Expression<Func<TDestination, object>> selector)
{
map.ForMember(selector, config => config.Ignore());
return map;
}
公共静态IMappingExpression忽略(此IMappingExpression映射,
表达式选择器)
{
map.ForMember(选择器,config=>config.Ignore());
返回图;
}
但如果我尝试忽略控制器中的内联属性,则会起作用,如下所示:
[HttpPost]
[Route("{loadAreaId}/details")]
public IHttpActionResult AddLoadAreaSlotDetails([FromUri] string loadAreaId, [FromBody] LoadAreaSlotDetailForAddDto loadAreaSlotDetails)
{
var loadAreaSlotDetailEntity = Mapper.Map<LoadAreaSlotDetailForAddDto, LoadAreaSlotDetail>(loadAreaSlotDetails, opt => opt.ConfigureMap().ForMember(d => d.LoadArea, o => o.Ignore()));
_repo.AddLoadAreaSlotDetail(loadAreaSlotDetailEntity);
return Ok();
}
[HttpPost]
[路由(“{loadAreaId}/details”)]
public IHttpActionResult AddLoadAreaSlotDetails([FromUri]字符串loadAreaId,[FromBody]LoadAreaSlotDetailForAddToLoadAreaSlotDetails)
{
var loadAreaSlotDetailEntity=Mapper.Map(loadAreaSlotDetails,opt=>opt.ConfigureMap().formMember(d=>d.LoadArea,o=>o.Ignore());
_repo.AddLoadAreaSlotDetail(loadAreaSlotDetailEntity);
返回Ok();
}
这向我证明了Ignore可以工作,但同时我假设我正在错误地初始化和配置映射,但我不知道为什么,因为许多其他示例正在使用静态API以相同的方式初始化。我在一个.NET核心项目(在ConfigureServices方法中)中也做了同样的工作,并且映射工作正常,默认情况下它也会忽略未映射的属性
为什么会发生这种情况?您是否尝试过使用AutoMapper配置文件 然后我可以在我的WebApi应用程序的Startup.cs中配置它。我使用SimpleInjector作为容器:
var profiles =
Assembly
.GetExecutingAssembly()
.GetTypes()
.Where(t => typeof(Profile).IsAssignableFrom(t))
.ToList();
Mapper.Initialize(
mp =>
{
var mapperConfiguration = new MapperConfiguration(cfg => cfg.AddProfiles(profiles));
var mapper = mapperConfiguration.CreateMapper();
container.Register(() => mapper, Lifestyle.Scoped);
});
然后,您需要定义一个或多个配置文件,具体取决于您希望拆分自动映射器配置的方式
public class UserProfile : Profile
{
public UserProfile()
{
CreateMap<UserDetails, UserTransferObject>();
CreateMap<UserAndAccountDetails, UserAndAccountTransferObject>();
CreateMap<User, UserAndAccountTransferObject>()
.ForMember(
dest => dest.DifferentPropertyName,
orig => orig.MapFrom(src => src.OriginalPropertyName));
}
}
公共类UserProfile:Profile
{
公共用户配置文件()
{
CreateMap();
CreateMap();
CreateMap()
福门博先生(
dest=>dest.DifferentPropertyName,
orig=>orig.MapFrom(src=>src.OriginalPropertyName));
}
}
您是否尝试过使用AutoMapper配置文件
然后我可以在我的WebApi应用程序的Startup.cs中配置它。我使用SimpleInjector作为容器:
var profiles =
Assembly
.GetExecutingAssembly()
.GetTypes()
.Where(t => typeof(Profile).IsAssignableFrom(t))
.ToList();
Mapper.Initialize(
mp =>
{
var mapperConfiguration = new MapperConfiguration(cfg => cfg.AddProfiles(profiles));
var mapper = mapperConfiguration.CreateMapper();
container.Register(() => mapper, Lifestyle.Scoped);
});
然后,您需要定义一个或多个配置文件,具体取决于您希望拆分自动映射器配置的方式
public class UserProfile : Profile
{
public UserProfile()
{
CreateMap<UserDetails, UserTransferObject>();
CreateMap<UserAndAccountDetails, UserAndAccountTransferObject>();
CreateMap<User, UserAndAccountTransferObject>()
.ForMember(
dest => dest.DifferentPropertyName,
orig => orig.MapFrom(src => src.OriginalPropertyName));
}
}
公共类UserProfile:Profile
{
公共用户配置文件()
{
CreateMap();
CreateMap();
CreateMap()
福门博先生(
dest=>dest.DifferentPropertyName,
orig=>orig.MapFrom(src=>src.OriginalPropertyName));
}
}
你看到了吗?你看到了吗?