【问题标题】:Automapping one table entity to two DTO subclasses将一个表实体自动映射到两个 DTO 子类
【发布时间】:2017-04-24 12:06:13
【问题描述】:

我有一张桌子留言:

CREATE TABLE [Communication].[Message]
(
    [MessageID] BIGINT NOT NULL PRIMARY KEY IDENTITY, 
    [MessageChannelID] INT NOT NULL,
    [MessageStatusID] INT NOT NULL, 
    [Sender] NVARCHAR(100) NOT NULL, 
    [SenderDisplayName] NVARCHAR(100) NULL, 
    [Receiver] NVARCHAR(100) NOT NULL, 
    [Content] NVARCHAR(MAX) NULL, 
    [EmailUseSSL] BIT NOT NULL DEFAULT 0, 
    [EmailReceiverCC] NVARCHAR(100) NULL, 
    [EmailReceiverBCC] NVARCHAR(100) NULL, 
    [EmailSenderReplyTo] NVARCHAR(100) NULL, 
    [EmailSubject] NVARCHAR(300) NULL, 
    [SMSGUID] NVARCHAR(100) NULL, 
    [CreatedAt] DATETIME NOT NULL DEFAULT getDate(), 
    [Note] NVARCHAR(300) NULL, 
    CONSTRAINT [FK_Message_MessageStatus] FOREIGN KEY ([MessageStatusID]) REFERENCES [Communication].[MessageStatus]([MessageStatusID]), 
    CONSTRAINT [FK_Message_MessageChannel] FOREIGN KEY ([MessageChannelID]) REFERENCES [Communication].[MessageChannel]([MessageChannelID])
)

我有 DTO 课程:

public class MessageDTO
{
    public int MessageID { get; set; }
    public string Sender { get; set; }
    public string SenderDisplayName { get; set; }
    public string Receiver { get; set; }
    public string Content { get; set; }
    public DateTime CreatedAt { get; internal set; }
    public string Note { get; set; }
    public MessageStatus Status { get; set; }
    public MessageChannel Channel { get; internal set; }
}

public class EmailMessageDTO: MessageDTO
{
    public bool EmailUseSSL { get; set; }
    public string EmailReceiverCC { get; set; }
    public string EmailReceiverBCC { get; set; }
    public string EmailSenderReplyTo { get; set; }
    public string EmailSubject { get; set; }
}

public class SMSMessageDTO: MessageDTO
{
    public string SMSGUID { get; set; }
}

消息类型可以从 MessageChannelID(Email、SMS)解析。是否可以使用 Automapper 获取具有特定状态的所有消息,以便将某些消息映射到 EmailMessageDTO,将其他消息映射到 SMSMessageDTO?我想编写一个 GetMessages 方法,根据消息类型返回所有​​消息,对象为 EmailMessageDTO 或 SMSMessageDTO。

【问题讨论】:

  • 您是否尝试过类似的操作:stackoverflow.com/questions/9746650/… - 本质上是使用 ConstructUsing 函数并映射到基本类型 - 任何映射都将通过 ConstructUsing 创建其实例。唯一的问题可能是特定的映射选项可能无法使用,我不确定 AutoMapper 是否会意识到它不再是 dto -> base 映射并使用更具体的映射配置。
  • 我看到了那个解决方案,它帮我解决了这个问题!

标签: c# sql automapper dto


【解决方案1】:

在查理的评论之后,我想出了这个:

x.CreateMap<Message, MessageDTO>()
                    .ForMember(m => m.Status, opts => opts.MapFrom(src => src.MessageStatusID))
                    .ForMember(m => m.Channel, opts => opts.MapFrom(src => src.MessageChannelID))
                    .ConstructUsing(m =>
                    {
                        if (m.MessageChannelID == (int)Data.MessageChannel.Email)
                            return new EmailMessageDTO
                            {
                                EmailReceiverBCC = m.EmailReceiverBCC,
                                EmailReceiverCC = m.EmailReceiverCC,
                                EmailSenderReplyTo = m.EmailSenderReplyTo,
                                EmailSubject = m.EmailSubject,
                                EmailUseSSL = m.EmailUseSSL
                            };
                        else return new SMSMessageDTO
                        {
                            SMSGUID = m.SMSGUID
                        };
                    });

【讨论】:

  • 酷,它仍然有点手动,但至少它包含在映射配置中,所以你不必考虑它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2018-09-13
相关资源
最近更新 更多