我有一个包含基于接口的属性的模型,具体实现可以通过模型的另一个属性发现。
public class SubscriptionViewModel
{
public Guid Id { get; set; }
...
public SubscriptionTypeEnum SubscriptionType { get; set; } // <- Determines the concrete class
public ISubscriptionCriteria SubscriptionCriteria { get; set; } //<- Property based on interface class
...
}
当存在基于接口的属性时,控制器中的模型将为null。如果删除,一切都会按预期结束。
[HttpPost("api/[controller]/[action]")]
public async Task Post([FromBody]SubscriptionViewModel model)
{
...
}
这是因为控制器不知道用于接口的实体实现。
我有什么想法可以解决这个问题?看起来这可能是使用自定义IModelBinderProvider
或BindingBehaviorAttribute
?
我想我可以有SuperSubscriptionCriteria
实现,其中包含ISubscriptionCriteria
的具体实现所使用的所有可能属性,然后依靠AutoMapper将它们转换为实际实现。但这似乎是一种黑客攻击,并且随着新ISubscriptionCriteria
实施的添加需要持续维护。