Является ли этот код подходящим кандидатом для ActionFilter? - PullRequest
2 голосов
/ 09 августа 2011
public ActionResult Index(int ehrId, int? page)
{
    EHR ehr = ehrRepository.FindById(ehrId);
    if (ehr.UserName != User.Identity.Name)
        return View("Invalid Owner");

    var physicaltests = ehr.PhysicalTests.Where(test=>!test.IsDeleted).OrderByDescending(test => test.CreationDate);
    List<PhysicalTestListItem> physicalTestsVM = new List<PhysicalTestListItem>();
    Mapper.Map(physicaltests, physicalTestsVM);
    var paginatedTests = physicalTestsVM.ToPagedList(page ?? 0, PAGESIZE);// new PaginatedList<PhysicalTestListItem>(physicalTestsVM, page ?? 0, pageSize);
    return View(paginatedTests);
}

public ActionResult Create(int ehrId)
{
    EHR ehr = ehrRepository.FindById(ehrId);
    if (ehr.UserName != User.Identity.Name)
        return View("Invalid Owner");

    return View(new PhysicalTestForm());
}

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

1 Ответ

1 голос
/ 09 августа 2011

Я бы так подумал

Фильтр действий подойдет для проверки входных данных.

Например,

EHR ehr = ehrRepository.FindById(ehrId);
if (ehr.UserName != User.Identity.Name)
  return View("Invalid Owner");

Подойдет дляПоместив в фильтр действий, я создал другую проверку входных данных, как в [Требуется вход в систему] или [Требуется SSL] в прошлом, чтобы несколько действий могли использовать один и тот же код (onBeforeExcuting или onAfterExecuted).

Аспектно-ориентированное программирование для сквозных задач

Однако в других аспектах, таких как ведение журналов, являющихся сквозными задачами для всех уровней вашей архитектуры, вы можете захотеть взглянуть на AOP (Аспектно-ориентированное программирование), чтобы избежатьдублирование кода там.

Обновление - Пример кода (не проверено)

public class CheckValidUserAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      IMyRepository myRepository = IoC.Resolve<IMyRepository>();
      Int64 userId;      
      if(Int64.TryParse(filterContext.HttpContext.Request.QueryString["id"]), out userId))
         if(!IsValidUser(userId))
            filterContext.Result = new InvalidUserResult();   
     }

     public bool IsValidUser(IMyRepository myRepository, Int64 userId)
     {
       EHR ehr = ehrRepository.FindById(ehrId);      
       return ehr != null && ehr.UserName == User.Identity.Name;
     }
}

Что-то вродевышеописанное должно сделать это, вам нужно создать именованное представление, чтобы вернуть вашего «Недопустимого пользователя», однако это должно быть тривиально.В сети должно быть много примеров того, как создавать и использовать фильтры действий.Лично я учился у Pro ASP.NET MVC Framework и

...