Подтвердить что ты не робот

Работа с наследованием

В настоящее время я работаю над приложением, которое использовало наследование в одном сценарии. Но теперь у меня есть задача, когда мне нужно вернуть более одного вида из моего модельного построителя. Я опишу ниже:

В моем методе контроллера мы сохранили его и использовали построенные модели.

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. Просто, чтобы люди знали, что это используется несколькими представлениями для другой виртуальной машины и класса сущности, будет передан в?

4b9b3361

Ответ 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

Если это недопустимо, бросьте ошибку и поймайте ее вверх (например, в первом блоке кода выше) и визуализируйте недопустимую модель просмотра или дескриптор, но вы хотите. Будет ли это работать в вашем сценарии?