Работа с наследованием
В настоящее время я работаю над приложением, которое использовало наследование в одном сценарии. Но теперь у меня есть задача, когда мне нужно вернуть более одного вида из моего модельного построителя. Я опишу ниже:
В моем методе контроллера мы сохранили его и использовали построенные модели.
public ViewResult Summary(ReportArgs args)
{
return View<SomeBuilder>(args);
}
Затем он обращается к методу построения, который наследуется от базового класса.
public class SomeBuilder : NewBuilder<TaskVM, Task> {}
Затем NewBuilder имеет следующую реализацию:
public class NewBuilder<TModel, TItem> : ReportBuilder where TModel : SomeReportVM<TItem>, new() where TItem : ReportItem
{
public override ReportVM Build(ReportArgs args)
{
/* Some code to get roles here */
return new TModel
{
FeedbackModel = FeedbackBuilder.Build(inputGrid.Report.Id),
};
}
}
Что мне нужно сделать, это вернуть другую VM из контроллера NewBuilder, но изо всех сил пытаюсь найти лучший способ сделать это?
Я не могу вернуть InvalidVM при передаче в TaskVM. Просто, чтобы люди знали, что это используется несколькими представлениями для другой виртуальной машины и класса сущности, будет передан в?
Ответы
Ответ 1
public class EnhancedBuilder<TModel, TItem, TInvalidModel> : NewBuilder<TModel, TItem>
where TModel : SomeReportVM<TItem>, new()
where TItem : ReportItem
where TInvalidModel : SomeReportVM<TItem>, new() // Made an assumption here.
// It would likely be wise to create an InvalidVM base class to handle common
// issues such as roles, and defer the rest to child builders.
{
public override ReportVM Build(ReportArgs args)
{
/* Some code to get roles here */
if( ** validation code fails ** )
{
return new TInvalidModel
{
}
}
return new TModel
{
FeedbackModel = FeedbackBuilder.Build(inputGrid.Report.Id),
};
}
}
Тогда ваш SomeBuilder будет выглядеть немного иначе.
public class SomeBuilder<TInvalidVM> : NewBuilder<TaskVM, Task, TInvalidVM>
where TInvalidVM : SomeReportVM<TItem>, new()
{
}
И, наконец, называя это:
public ViewResult Summary(ReportArgs args)
{
return View<SomeBuilder<MyInvalidVM>>(args);
}
Ответ 2
Если это недопустимо, бросьте ошибку и поймайте ее вверх (например, в первом блоке кода выше) и визуализируйте недопустимую модель просмотра или дескриптор, но вы хотите. Будет ли это работать в вашем сценарии?