ASP.NET MVC - добавление фильтров действий программно - PullRequest
5 голосов
/ 24 января 2009

Я провел небольшое исследование относительно фильтров действий и подумал, есть ли способ добавить их программно в контроллеры ??

Чтобы дать некоторый контекст, я бы хотел добавить фильтр ведения журнала, если ведение журнала настроено в web.config, иначе я не хочу, чтобы фильтр существовал в цепочке выполнения каждого метода действия.

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

Большое спасибо!

Ответы [ 5 ]

1 голос
/ 24 января 2009

Лучшим решением было бы использование шаблона нулевого объекта .

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

Простая фабрика может принять решение о том, какую реализацию логгера доставить в фильтр или любой контейнер IOC можно настроить для его обработки.

1 голос
/ 24 января 2009
    [LogRequest]
    [PermissionRequired(Permits.View_users, Permits.Edit_users)]
    public ActionResult Edit(int id, .....)
            {
             ...
            }

    public class PermissionRequired : ActionFilterAttribute, IActionFilter
{
    private readonly PermissionsList permits;

    public PermissionRequired(params Permits[] perm)
    {
        permits = new PermissionsList(perm);
    }

    #region IActionFilter Members

    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {
        ...
        IEnumerable<int> intersection = (from up in User.CurrentUser.UserPermission
                                         select up.PermissionID).ToList().Intersect(permits.Cast<int>());
        if (intersection.Count() != permits.Count)
        {
            filterContext.Result = null;
            HttpContext.Current.Response.Redirect("/Error/PermissionsRequired.htm");
        }
    }

    #endregion
}
0 голосов
/ 19 февраля 2009

Я просматривал новый код Oxite (последняя версия подверглась серьезному рефакторингу из-за массированной критики), и они делают что-то интересное Они создают свой собственный ActionFilterRepository для хранения различных фильтров (IActionFilters, IAuthorizationFilters и т. Д.). В пользовательском ControllerActionInvoker метод GetFilters переопределяется и добавляет фильтры из хранилища в текущую коллекцию. Таким образом, у них есть набор глобальных фильтров, применяемых к каждому действию и контроллеру.

Вы можете увидеть пользовательский код invoker здесь: OxiteControllerActionInvoker.cs

И пример фильтра здесь: LocalizationActionFilter.cs

Надеюсь, это поможет.

0 голосов
/ 24 января 2009

Вы можете заняться созданием собственной реализации ActionInvoker, класса, который обрабатывает вызовы фильтров и методов действий. Сказав, что я не думаю, что это хорошее решение. Это нарушает разделение интересов. Лучше, чтобы ваш фильтр действий журналирования определял, должна ли регистрация происходить или нет.

0 голосов
/ 24 января 2009

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

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

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