4

我想创建一个过滤器并将其放置在需要访问数据库的操作上。此过滤器将处理当前的工作单元,因此我不需要在一个操作中手动调用它一次或多次。我正在这样做:

    public class DisposeUnitOfWorkAttribute :FilterAttribute, IActionFilter
    {
        public Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
        {
            IUnitOfWork currentUnitOfWork = UnitOfWork.Current;
            if (currentUnitOfWork != null)
            {
                currentUnitOfWork.Dispose();
            }
            return null;
        }

        public bool AllowMultiple
        {
            get { return false; }
        }
    }


    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new DisposeUnitOfWorkAttribute());
            filters.Add(new HandleErrorAttribute());
        }
    }


        [DisposeUnitOfWork]
        public ViewResult Index()
        {            
            var user = _usersRepository.Get(x => x.Username == "jack").ToList();
            //UnitOfWork.Current.Dispose();
            return View();
        }

我得到了例外:The given filter instance must implement one or more of the following filter interfaces: IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter.

我该如何纠正这个?

4

2 回答 2

4

从您的代码来看,您正在尝试将过滤器用作 Web API 过滤器,但将其添加到 FilterConfig.cs 中的错误过滤器集合(类似 MVC)

The given filter instance must implement one or more of the following filter interfaces: IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter.

您应该将过滤器添加到 Web API 全局过滤器集合中,而不是在 WebApiConfig.cs 中:

    public static void Register(HttpConfiguration config)
    {
        // Add custom global filters

        // Handle validation errors
        config.Filters.Add(new DisposeUnitOfWorkAttribute());
于 2013-04-08T15:28:17.620 回答
2

我猜你需要继承ActionFilterAttributenot FilterAttribute

public class DisposeUnitOfWorkAttribute : ActionFilterAttribute
{
   ...
}
于 2012-09-21T19:50:13.300 回答