0

Я спрашиваю это потому, что после долгого времени поиска я не нашел хороший ответ на это еще ...ASP.NET комплекс проверка в бизнесе/уровне услуг

Вот что я хочу:

Пример. У меня есть модель домена «JobPosting», которую пользователь должен иметь возможность изменять состояние для публикации, если оно все еще является черновиком. Перед публикацией я должен не только проверять свойства модели, я также должен проверять множество различных требований относительно учетной записи пользователя, зарегистрированной компании и т. Д. Вся эта логика проверки помещается в сервисный уровень. До сих пор так хорошо ...

Это как мой уровень услуг выглядит следующим образом:

public IValidationResult ValidatePublish(JobPosting jobPosting){ 
    ... 
} 

public void Publish(JobPosting jobPosting){ 
    jobPosting.State = JobPostingState.Published; 
    ... 
} 

Любой мой контроллер:

public ActionResult Publish(PublishViewModel model){ 
    ... 
    var validationResult = _jobService.ValidatePublish(jobPosting); 
    if(validationResult.Success){ 
     _jobService.Publish(jobPosting); 
     ... 
    } 
    ... 
} 

И вот теперь мои вопросы:

Я хочу чтобы иметь возможность вызывать ValidatePublish с контроллера, чтобы отображать ошибки проверки в представлении. Однако я никогда не смогу опубликовать задание, когда проверка не удалась. Так, чтобы мой код более надежным я добавил вторую проверку достоверности в моей Publish методы в сервисном слое:

public void Publish(JobPosting jobPosting){ 
    if(ValidatePublish(jobPosting).Success){ 
     jobPosting.State = JobPostingState.Published; 
     ... 
    } 
} 

, но у меня не такое хорошее чувства, с этим подходом, потому что теперь я называю проверку дважды, когда проверка ОК в течение каждого запроса публикации контроллера.

Что вы думаете. Второй вызов? Есть ли лучший подход? Я прошу, потому что все мое приложение выглядит так, и если я когда-нибудь забуду приглашение на проверку в контроллере, я могу закончить состояние недопустимой модели домена в базе данных. Вот почему я добавил вторую проверку валидации в каждом сервисном методе.

Заранее благодарим за это!

+0

«Я вызываю проверку дважды», где вы вызываете проверку во второй раз? –

+0

Первый вызов в контроллере: var validationResult = _jobService.ValidatePublish (jobPosting); Второе время в методе обслуживания if (ValidatePublish (jobPosting) .Success) { – Simon

+0

, то почему вы снова проверяете метод? Вы можете просто публиковать прямо. –

ответ

1

Одним из быстрых решений может быть присвоение класса Publisher объектам JobPosting и IValidationResult в качестве аргументов.

public void Publish(JobPosting jobPosting, IValidationResult validation) 
{ 
    if (validation.IsValid) 
    { 
     jobPosting.State = JobPostingState.Published; 
     // other work here... 
    } 
} 

Ваш Controller может затем вызвать Validator, получить IValidationResult и передать обратно в слой представления, если это необходимо. В противном случае перейти к Publisher

public ActionResult Publish(PublishViewModel model) 
{ 
    var validationResult = _jobService.ValidatePublish(jobPosting); 
    if(validationResult.Success) _jobService.Publish(jobPosting, validationResult); 
    else return View("error", validationResult); 
} 

Edit:

уборщик решения может быть иметь Publisher класса возвращает PublishAttempt результата.

public class PublishAttempt : IValidationResult 
{ 
    public enum AttemptOutcome {get; set;} 
} 

public ActionResult Publish(PublishViewModel model) 
{ 
    var attempt = _jobService.Publish(jobPosting); 
    if (attempt.Success) return View("success"); 
    else return View("error", attempt.ValidationResults); 
} 
+0

Спасибо! Да, это тоже будет подход ... но мне не нравится, что я могу передать любой экземпляр результата проверки ... мог бы даже создать новый пустой, который всегда действителен. – Simon

+0

О, спасибо :-) Да, мне нравится ... Может быть, я объединил вашу идею с моим последним ответом :-) только потому, что мне нужна возможность вызова только метода проверки ... например. когда я хочу вызвать валидацию службы через ajax, чтобы показать ошибки в «реальном времени» – Simon

-1

Следующие только что пришли мне в голову ...что вы думаете:

я изменить метод сервиса для:

public IValidationResult Publish(JobPosting jobPosting, bool validateOnly = false){ 
    var validationResult = ValidatePublish(jobPosting); 
    if(validateOnly) return validationResult; 

    jobPosting.State = JobPostingState.Published; 
    ... 
    return validationResult; 
}   

А затем в контроллере я всегда называю только Опубликовать метод, а не дополнительные ValidatePublish больше:

public ActionResult Publish(PublishViewModel model) 
{ 
    var validationResult = _jobService.Publish(jobPosting); 
    if(!validationResult.Success) return View("error", validationResult); 
} 

И когда Мне нужна только простая проверка.

var validationResult = _jobService.Publish(jobPosting, true); 

Является ли это okey, чтобы сделать это так? Или это не хорошо выглядит, если нормальный служебный вызов возвращает идентификацию IValidationResult?

+0

Или вы считаете, что лучше реализовать какой-то результат за один метод службы? – Simon