我尝试映射 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 中搜索了想法,但没有成功。
我认为模型过于复杂。在您的控制器
NewFirewall(FirewallDto firewallDto)
中,FirewallDto 将不会收到足够的有效负载,因为它没有“DestinationPorts”或“FqdnTags”属性。您可以将它们设置为可为空的属性,以便使这些属性成为可接收的。然后进行自动映射器配置,将它们有条件地映射到正确的模型。您可以尝试以下操作: 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; }
}