C#-具有自定义类型转换的自动映射器

时间:2020-05-15 18:41:56

标签: c# asp.net-mvc asp.net-core automapper

我正在尝试将请求对象映射到域,我可以阅读英语,但是我绝对不能在自动映射器文档中找到解决方案。

问题:

我如何基于ContainedEvent对象中的EventType属性将ContainedEvent对象从源映射到目标对象中的派生类,因为Event是抽象类。 因此,假设源对象中的EventType == 1,则应将Event属性转换为其派生类之一。我也不想映射null属性,但是我已经处理了。

这是请求对象

public class CreatePostRequest
    {

        public long EventTime { get; set; }

        public List<IFormFile>? Pictures { get; set; }

        public ContainedEvent Event { get; set; }

        public virtual List<string>? Tags { get; set; }
    }   

    public class ContainedEvent
    {
        public string Description { get; set; }
        #nullable enable
        public string? Requirements { get; set; }
        public int? Slots { get; set; }
        public double? EntrancePrice { get; set; }
        public int EventType { get; set; }
    }


这是域对象

 public class Post
    {
        public int Id { get; set; }

        public DateTime EventTime { get; set; }

        public Location Location { get; set; }

        public int LocationId { get; set; }

        public AppUser User { get; set; }

        public string UserId { get; set; }

        public Event Event { get; set; }

        public int EventId { get; set; }

        #nullable enable
        public IEnumerable<string>? Pictures { get; set; }

        #nullable enable
        public virtual List<PostTags>? Tags { get; set; }
   }
 public abstract class Event
    {
        public int Id { get; set; }

        public string Description{ get; set; }

        public string? Requirements { get; set; }

        public Post? Post { get; set; }
    }



这就是我所坚持的。.

 public class RequestToDomainProfile : Profile
    {
        public RequestToDomainProfile()
        {
             CreateMap<CreatePostRequest, Post>()
                 .ForAllMembers(opt => opt.Condition((src, dest, srcMember) => srcMember != null));

        }
    }

1 个答案:

答案 0 :(得分:1)

这个想法是将所有Event实现存储在context.Items中,并在映射中提供一个选择器。

没有测试过,但应该是这样

创建地图时:

CreateMap<CreatePostRequest, Post>()
    .ForMember(x => x.Event, opt => opt.MapFrom((src, dest, destMember, context) => 
        { 
            if(src.Event.EventType == 1)
            {
                return context.Items["EventImplementation1"];
            }

            if(src.Event.EventType == 2)
            {
                return context.Items["EventImplementation2"];
            } 

            // ...
        }));

映射对象时:

Post p = _mapper.Map<CreatePostRequest, Post>(postRequest, opts => 
    { 
        opts.Items["EventImplementation1"] = new YourFirstEventImplementation(); 
        opts.Items["EventImplementation2"] = new YourSecondEventImplementation(); 
        // ...
    });
相关问题