/ / Ce code est-il un bon candidat pour un ActionFilter? - asp.net-mvc, filtre d'action

Ce code est-il un bon candidat pour un ActionFilter? - asp.net-mvc, action-filter

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());
}

J'ai absolument toutes mes méthodes dans mon PhysicalTestsController exécuter ces trois lignes de code avant l'exécution. Comment puis-je refactoriser cela pour éviter autant de répétitions? Je n'ai inclus que deux de mes méthodes, mais il existe en fait six méthodes.

Réponses:

1 pour la réponse № 1

Je le penserais

Un filtre d'action serait approprié pour valider les données d'entrée.

Par exemple

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

Serait approprié de mettre dans un filtre d'action,J'ai créé une autre validation d'entrée comme dans [Nécessite une connexion] ou [NécessiteSSL] dans le passé afin que plusieurs actions puissent partager le même code (onBeforeExcuting, ou onAfterExecuted).

Programmation orientée aspect pour les préoccupations transversales

Cependant, d'autres choses telles que la journalisation qui est unproblème transversal à travers toutes les couches de votre architecture, vous voudrez peut-être vous pencher sur AOP (Aspect Oriented Programming) pour éviter la duplication de code.

Mise à jour - Exemple de code (non testé)

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;
}
}

Quelque chose comme ce qui précède devrait le faire, vous auriez besoinpour créer une vue nommée pour renvoyer votre "Utilisateur invalide", cependant cela devrait être trivial. Il devrait y avoir beaucoup d'exemples sur le net sur la façon de créer et d'utiliser des filtres d'action. Personnellement, j'ai appris de Pro ASP.NET MVC Framework et