C# Automapper 和父类型列表不映射子对象

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

我尝试映射 FirewallRule 的子级,当控制器收到有效负载时,firewallDto 未与 DestinationPorts 映射。 数据被修剪,结构在 FirewallRule 处停止。

我尝试了AutoMapper的多个映射配置文件,但它不起作用,搜索了所有内容,但没有得到预期的结果。 如果我阅读正文并删除firewallDto,那么有效负载看起来就像预期的那样,所以我认为我尝试过的映射不够好,或者我丢失了一些我看不到的东西。

总而言之,如果 DestinationPorts 在有效负载中,则映射到 NetworkRule,如果 FqdnTags 在标签中,则映射到 ApplicationRule。

如果我遗漏了帖子中的某些内容,我会编辑它。

有效负载:

{
  "id": 0,
  "name": "string",
  "priority": 0,
  "action": "string",
  "rules": [
        {
            "ruleType": "NetworkRule",
            "name": "myName",
            "description": "mydescription",
            "DestinationPorts": [""]
        }
  ]
}

控制器中的外观:

{
  "id": 0,
  "name": "string",
  "priority": 0,
  "action": "string",
  "rules": [
        {
            "ruleType": "NetworkRule",
            "name": "myName",
            "description": "mydescription"
        }
  ]
}

代码:

// Classes
public class Firewall 
{
    public string Name { get; set; }
    public int Priority { get; set; }
    public string Action { get; set; }
    public List<FirewallRule> Rules { get; set; }
}

public class FirewallRule
{
    public string RuleType { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

public class ApplicationRule : FirewallRule
{
    public string[] FqdnTags { get; set; }
}

public class NetworkRule : FirewallRule
{
    public string[] DestinationPorts { get; set; }
}

public class FirewallDto
{
    public string Name { get; set; }
    public int Priority { get; set; }
    public string Action { get; set; }
    public List<FirewallRuleDto> Rules { get; set; }
}

public class FirewallRuleDto
{
    public string RuleType { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

public class NetworkRuleDto : FirewallRuleDto
{
    public string[] DestinationPorts { get; set; }
}

public class ApplicationRuleDto : FirewallRuleDto
{
    public string[] FqdnTags { get; set; }
}
// Mapping
CreateMap<Firewall, FirewallDto>().
    ReverseMap();

CreateMap<FirewallRule, FirewallRuleDto>()
    .Include<NetworkRule, NetworkRuleDto>()
    .Include<ApplicationRule, ApplicationRuleDto>().
    ForMember(dest => dest.RuleType, opt => opt.MapFrom(src => src.RuleType));

CreateMap<NetworkRule, NetworkRuleDto>()
    .ReverseMap();

CreateMap<ApplicationRule, ApplicationRuleDto>()
    .ReverseMap();

CreateMap<FirewallRuleDto, FirewallRule>()
    .Include<NetworkRuleDto, NetworkRule>()
    .Include<ApplicationRuleDto, ApplicationRule>();

CreateMap<FirewallDto, Firewall>().
    ForMember(d => d.Rules, op => op.MapFrom(s => s.Rules));
// Controller
public async Task<ActionResult<Firewall>> NewFirewall(FirewallDto firewallDto) 
{
    // code
}

尝试了自动映射器的多个映射配置文件、简单的类,在谷歌上搜索自动映射器配置,也搜索了 stackoverflow,并从 chat-gipity 中搜索了想法,但没有成功。

c# asp.net-core .net-core automapper
1个回答
0
投票

我认为模型过于复杂。在您的控制器

NewFirewall(FirewallDto firewallDto)
中,FirewallDto 将不会收到足够的有效负载,因为它没有“DestinationPorts”或“FqdnTags”属性。您可以将它们设置为可为空的属性,以便使这些属性成为可接收的。然后进行自动映射器配置,将它们有条件地映射到正确的模型。您可以尝试以下操作:
防火墙规则.cs

    public class FirewallRule
    {
        public string RuleType { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string[]? DestinationPorts { get; set; }
        public string[]? FqdnTags { get; set; }
    }
© www.soinside.com 2019 - 2024. All rights reserved.