根据条件将一个对象转换为两个不同的 DTO

问题描述 投票:0回答:1

在我们的一个项目中,我们使用 .NET Automapper(版本 10.1.1)。在其他情况下,我们意识到使用 AutoMapper 过于复杂,并转向直接手动映射,这样更快、更灵活(我自己也更喜欢这种方法)。

无论如何,我们有下一个后端模型

TextDocumentItem
,它具有下一个属性:

public bool RichTextFormatting { get; set; }

根据

RichTextFormatting
属性是否为 true,我们希望将其映射到 RichTextBoxObjectApi,反之亦然到 TextBoxObjectApi。

this.CreateMap<TextDocumentItem, TextBoxObjectApi>();
this.CreateMap<TextDocumentItem, RichTextBoxObjectApi>();

Automapper 支持这样的东西吗?我在看

.If
方法?

在预编码中:

this.CreateMap<TextDocumentItem, TextBoxObjectApi>()
    .If(src => src.RichTextFormatting === true);

this.CreateMap<TextDocumentItem, RichTextBoxObjectApi>();
    .If(src => src.RichTextFormatting === false);
.net automapper automapper-10
1个回答
0
投票

在 AutoMapper 中执行映射时,您必须提供目标类型。因此,您应该实现确定要映射的类型的逻辑,而不是依赖 AutoMapper(据我所知,没有这样的功能)。

如果您尝试根据其类型执行进一步的逻辑,您可能会为

TextBoxObjectApi
RichTextBoxObjectApi
类定义一个(公共)接口。

public ITextBoxObjectApi MapTextDocumentItem(IMapper _mapper, TextDocumentItem source)
{
    if (source.RichTextFormatting)
        return _mapper.Map<RichTextBoxObjectApi>(source);
    else
        return _mapper.Map<TextBoxObjectApi>(source);
}
public class TextDocumentItem
{

}

public class TextBoxObjectApi: ITextBoxObjectApi
{

}

public class RichTextBoxObjectApi : ITextBoxObjectApi
{

}

来电者:

var mappedItem = MapTextDocumentItem(_mapper, /* TextDocumentItem instance */);

if (mappedItem is TextBoxObjectApi)
{
    // Implementation for TextBoxObjectApi instance
}
else if (mappedItem is RichTextBoxObjectApi)
{
    // Implementation for RichTextBoxObjectApi instance
}

演示@.NET Fiddle

© www.soinside.com 2019 - 2024. All rights reserved.