ASP MVC ofera posibilitatea declararii unor actiuni comune folosind action filter. Odata ce am implementat un action filter, orice controller sau actiune poate sa fie decorata cu comportamentul pe care noi l-am definit. Se aseamana oarecum cum AOP-ul. Pentru mai multe informatii puteti sa gasiti aici.
Dar daca folosim Ioc, ar fi frumos si uneori necesar sa putem injecta action filtere la runtime. Pentru acest lucru propun urmatorul mecanism:
Dupa acest moment putem sa declaram orice action filter, care sa implementeze o interfata propie, de exemplu:
Iar apoi daca vreti sa decorati o actiune cu acest action filter o sa fie nevoie sa faceti urmatorul lucru:
Aceasta este solutia pe care eu o propuna. Singura problema este ca nu putem folosii direct numele la interfata ca si atribut. Avantajul principal este ca functioneaza pe orice mecanism de Ioc.
Dar daca folosim Ioc, ar fi frumos si uneori necesar sa putem injecta action filtere la runtime. Pentru acest lucru propun urmatorul mecanism:
public class ActionFilterInIocAttribute : ActionFilterAttribute, IActionFilter
{
private IActionFilter _actionFilter;
public ActionFilterInIocAttribute(Type filterType)
{
_actionFilter = Ioc.GetObject(filterType);
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
_actionFilter.OnActionExecuted(filterContext);
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
_actionFilter.OnActionExecuting(filterContext);
}
}
Dupa acest moment putem sa declaram orice action filter, care sa implementeze o interfata propie, de exemplu:
public interface ICustomActionFIlter{}
public class CustomActionFilter : ActionFilterAttribute, ICustomActionFIlter
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//...
}
}
Iar apoi daca vreti sa decorati o actiune cu acest action filter o sa fie nevoie sa faceti urmatorul lucru:
[ActionFilterInIoc(typeof(ICustomActionFIlter))]
public void ActionName(CarViewModel carViewModel)
Aceasta este solutia pe care eu o propuna. Singura problema este ca nu putem folosii direct numele la interfata ca si atribut. Avantajul principal este ca functioneaza pe orice mecanism de Ioc.
Comments
Post a Comment