Атрибут проверки в зависимости от типа экземпляра объекта

У меня проблема с зачатием. Мы могли бы создавать и обновлять наши сделки двумя способами: используя веб-формы (одна для создания сделок, другая для их редактирования) и через файл интеграции (чтобы разрешить массовое создание и обновление).

public class CreateDealViewModel
{
    public int dealID { get; set; }

    [ValidateSalesman]
    public int SalesmanID { get; set; }
}

public class EditDealViewModel
{
    public int dealID { get; set; }

    [ValidateSalesman]
    public int SalesmanID { get; set; }

}

public class IntegrationLine
{
    public int DealID { get; set; }

    [ValidateSalesman]
    public int SalesmanID { get; set; }

    public string Status { get; set; }
}

У меня есть логика проверки для реализации: при создании сделки принимаются только активные продавцы; при обновлении принимается активный продавец плюс предыдущее значение продавца (хранящееся в БД).

Я написал что-то вроде этого:

public class ValidateSalesman : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var container = validationContext.ObjectInstance;
        if (container.GetType() == typeof(IntegrationLine))
        {
            if(((IntegrationLine)container).Status == "CREATION") 
            {
                //Validation logic here
            }
            else 
            {
                 //Validation logic here
            }
        }
        else if(container.GetType() == typeof(CreateDealViewModel)) 
        {
           //Validation logic here
        } 
        else if(container.GetType() == typeof(EditDealViewModel)) 
        {
           //Validation logic here
        } 
     }
 }

}

Это хороший подход (совместимый с MVC) или нет? Должен ли атрибут проверки знать тип модели, к которой он применяется?

Заранее благодарю за любой совет :)


person Skualys    schedule 05.07.2015    source источник
comment
Вы должны проверить этот вопрос, который сейчас выполняется по аналогичной теме - stackoverflow.com/questions/31110329/   -  person ramiramilu    schedule 05.07.2015
comment
Ваш подход интересен (общий атрибут проверки и использование репозитория для доступа к БД). Но у меня все еще есть сомнения: в вашем примере вы передаете значение для проверки валидатору. В моем случае я должен отправить два параметра (значение и статус создания/обновления), поэтому мне все равно нужно проверить тип контейнера (CreateDealModelView, EditDealModelView или IntegrationFile). Есть ли что-то неправильное в этом? Или я должен отправить весь контейнер в ValidatorCommand?   -  person Skualys    schedule 05.07.2015
comment
В моем подходе я отправляю только тип команды. Вы также должны сделать то же самое. Произнесите команды создания — CreateCommand, EditCommand и т. д., а затем передайте их атрибуту проверки.   -  person ramiramilu    schedule 05.07.2015
comment
Хорошо, но как узнать, следует ли вызывать EditCommand или CreateCommand для IntegrationFile? (который может быть со статусом создания или обновления).   -  person Skualys    schedule 05.07.2015
comment
Например - [Validate(IIntegrationLineCommand)] public int alesmanID { get; set; }   -  person ramiramilu    schedule 05.07.2015
comment
У меня все еще есть две проблемы с этим: - Что мне делать в моей IntegrationLineCommand? Поскольку мне нужны два параметра (статус и значение), и в вашем примере вы просто отправляете значение - в моем случае это не совсем СУХОЙ, потому что некоторый код будет дублироваться между командами редактирования/создания сделки и командой IntegrationFile.   -  person Skualys    schedule 05.07.2015