Удалить дублирующий код из методов, которые зависят от результата возврата другого метода - PullRequest
0 голосов
/ 23 сентября 2011

В приложении ASP.NET MVC в классе контроллера у меня есть метод

        protected ActionResult VerifySanctions(string sanction)
        {

        bool hasSanctions = this.qualificationSanctionsService.HasSanctions(sanction);


        if (hasSanctions)
        {                               
              return this.RedirectToAction("Index", "Home");

        }
        return null;
        }

Этот метод содержит общую логику из разных других действий от другого контроллера Я решил создать базовый класс для контроллера, который будет хранить этот метод и извлекать из него другой контроллер. Но проблема в том, что когда я вызываю этот метод из действий производного класса, мне нужно проверить, не является ли он нулевым, а затем вернуть результат, например

    public ActionResult RegistrationTracking(EncryptedId sourceId)
    {
        // some code
        var registration = learnerRegistrationService.Get(sourceId);

        var result = this.VerifySanctions(registration.Qualification);
        if (result != null)
        {
            return result;
        }
         // some code
        return this.View();

    }

в других действиях мне нужно проверить, если результат снова не равен нулю

    public ActionResult Index(EncryptedId achievableVersionId)
    {
        var achievableVersion = achievableVersionService.Get(achievableVersionId);

        var verificationResult = this.VerifySanctions(achievableVersion);
        if (verificationResult != null)
        {
            return verificationResult;
        }          

         //some code
        return View();
    }

И я хочу избежать дублирования кода, кто-нибудь может мне помочь с примером или посоветовать? Что мне нужно, если не пройти проверку методом VerifySanction (), тогда ничего не делать, иначе вернуть результат действия.

ОБНОВИТЬ действия могут понравиться

        public ActionResult ModifyUnits(EncryptedId sourceId)
    {
        var registration = learnerRegistrationService.Get(sourceId);

        Check.Require(registration != null);
        Check.Require(registration.Enrolment != null, "QualificationEnrolment is null - RegistrationAmendments / ModifyUnits");
        var result = this.VerifySanctions(registration.Qualification, LookupOrganisationAchievableStatus.Sanction3);
        if (result != null)
        {
            return result;
        }

        if (!this.organisationAchievableService.IsAccessibleAchievableVersion(registration.Qualification.Id, this.GetOrganisationId()))
        {
            return new PopupFormResult().Notify(MUI.PleaseSelectACentre);
        }

        SetEnrolmentViewData(registration.Enrolment);

        ViewData["registrationId"] = sourceId;
        var isComposite = registration.Enrolment.IsComposite();
        ViewData["isComposite"] = isComposite;

        this.SetSelectedUnitsViewData(registration, isComposite);

        this.SetSelectedQualificationUnitsViewData(isComposite, registration);

        return this.PartialView("ModifyUnits", new List<UnitDisplay>());
    }

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 23 сентября 2011

Вы можете добавить метод в контроллер по умолчанию, расширенный всеми вашими контроллерами, для встраивания этой логики.Например,

private ActionResult ViewWithSanction(string sanction, ActionResult default)
{
  bool hasSanctions = this.qualificationSanctionsService.HasSanctions(sanction);
  if (hasSanctions) {                               
    return this.RedirectToAction("Index", "Home");
  }
  return default;
}

И тогда ваш метод может выглядеть как

public ActionResult RegistrationTracking(EncryptedId sourceId)
{
    var registration = learnerRegistrationService.Get(sourceId);
    return ViewWithSanction (registration.Qualification, View());
}

public ActionResult Index(EncryptedId achievableVersionId)
{
    var achievableVersion = achievableVersionService.Get(achievableVersionId);
    return ViewWithSanction (achievableVersion, View());
}
1 голос
/ 23 сентября 2011

Передайте Func<ActionResult>, который будет выполняться, когда hasSanctions ложно

private ActionResult VerifySanctions(Sanction sanction, Func<ActionResult> whenNoSanctions)
{
    bool hasSanctions = this.qualificationSanctionsService.HasSanctions(sanction);

    if (hasSanctions)
    {
        return RedirectToAction("Index", "Home");
    }

    return whenNoSanctions();
}

И вызывает

 return VerifySanctions(registration.Qualification, ()=> { //any code that returns ActionResult });

ОБНОВЛЕНИЕ:

Вы можете извлечь свою ненулевую часть как отдельный метод

private ActionResult WhenNoSanctions()
{
        if(!this.organisationAchievableService.IsAccessibleAchievableVersion(registration.Qualification.Id, this.GetOrganisationId()))
        {
            return new PopupFormResult().Notify(MUI.PleaseSelectACentre);
        }

        SetEnrolmentViewData(registration.Enrolment);

        ViewData["registrationId"] = sourceId;
        var isComposite = registration.Enrolment.IsComposite();
        ViewData["isComposite"] = isComposite;

        this.SetSelectedUnitsViewData(registration, isComposite);

        this.SetSelectedQualificationUnitsViewData(isComposite, registration);

        return this.PartialView("ModifyUnits", new List<UnitDisplay>());
}

И вызвать VerifySanctions как

 return VerifySanctions(registration.Qualification, WhenNoSanctions);
1 голос
/ 23 сентября 2011

Это должно работать:

 public ActionResult RegistrationTracking(EncryptedId sourceId)
    {
        var registration = learnerRegistrationService.Get(sourceId);                    
        return VerifySanctions(registration.Qualification, View());
    }

    private ActionResult VerifySanctions(Sanction sanction, ViewResult view)
    {
        bool hasSanctions = this.qualificationSanctionsService.HasSanctions(sanction);

        if (hasSanctions)
        {
            return RedirectToAction("Index", "Home");
        }

        return view;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...