ASP.NET Core MVC — модель привязки, содержащая свойство, использующее интерфейс

У меня есть модель, содержащая свойство на основе интерфейса, конкретная реализация которого может быть обнаружена через другое свойство модели.

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
    ...
}

Когда присутствует свойство, основанное на интерфейсе, модель в контроллере становится нулевой. Если удалить, все связывается, как и ожидалось.

[HttpPost("api/[controller]/[action]")]
public async Task Post([FromBody]SubscriptionViewModel model)
{
    ...
}

Это произойдет потому, что контроллер не знает, какую надежную реализацию использовать для интерфейса.

Любые идеи, как я могу это решить? Похоже, что это может быть достижимо с помощью пользовательского IModelBinderProvider или BindingBehaviorAttribute?

Думаю, у меня могла бы быть реализация SuperSubscriptionCriteria, содержащая все возможные свойства, используемые конкретными реализациями ISubscriptionCriteria, а затем полагаться на AutoMapper для преобразования их в реальные реализации. Но это похоже на взлом и потребует постоянного обслуживания по мере добавления новых реализаций ISubscriptionCriteria.


person Gavin    schedule 18.07.2017    source источник
comment
Какова цель наличия свойства ISubscriptionCriteria в ViewModel? Мне просто интересно.   -  person Win    schedule 19.07.2017
comment
В зависимости от типа подписки доступно несколько различных типов критериев, специфичных для определенных подписок. В этом случае подписки представляют собой оповещения по электронной почте о данных разрешений - www.permitwatch.co.nz   -  person Gavin    schedule 19.07.2017
comment
Как реальная реализация назначается ISubscriptionCriteria? Обычно ViewMode MVC не имеет внешних зависимостей, если только вы не используете его как MVVM. Просмотр модели.   -  person Win    schedule 19.07.2017
comment
AutoMapper используется для заполнения ViewModel из других классов, один из моих предыдущих q может дать более подробную информацию - stackoverflow.com/questions/38953348   -  person Gavin    schedule 19.07.2017