C# 使用Automapper静态初始化API放置映射的位置

C# 使用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 6.2.2,我正在尝试在Web应用程序中设置它。我试图使用直接放在Global.asax文件中的static
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));
}
}
你看到了吗?你看到了吗?