【问题标题】:Unity Attribute Interception with ASP.NET Web Api使用 ASP.NET Web Api 进行 Unity 属性拦截
【发布时间】:2015-10-14 23:49:45
【问题描述】:

我正在尝试使用 Unity 通过属性对我的 ApiController 方法应用调用处理程序,但从未调用过调用处理程序。

属性:

public class LogAttribute : HandlerAttribute
{
    private readonly int _order;

    public LogAttribute(int order)
    {
        _order = order;
    }

    public override ICallHandler CreateHandler(Microsoft.Practices.Unity.IUnityContainer container)
    {
        return new LoggingCallHandler
        { 
            Order = _order
        };
    }
}

调用处理程序:

  public class LoggingCallHandler : ICallHandler
    {
        public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
        {
          //.....stuff   
        }
    }

注册:

container.AddNewExtension<Interception>();
container.RegisterType<IMyApiController>();
container.Configure<Interception>()
     .SetInterceptorFor<IMyApiController>(new InterfaceInterceptor());

依赖解析器(使用 WebActiviatorEx):

public static class UnityWebApiActivator
{
    public static void Start() 
    {            
        var resolver = new UnityDependencyResolver(UnityConfig.GetConfiguredContainer());

        GlobalConfiguration.Configuration.DependencyResolver = resolver;
    }
}

【问题讨论】:

  • 你在哪里申请LogAttribute
  • 就在 ApiController 方法上...

标签: c# asp.net asp.net-web-api unity-container aop


【解决方案1】:

Web API 系统将使用依赖解析器来解析控制器类(例如MyApiController),而不是此类控制器类实现的接口(例如IMyApiController)。我不知道有什么方法可以让 Web API 系统请求接口(我怀疑是否有办法做到这一点)。

一种解决方案是自行拦截控制器 (MyApiController),但由于它是一个类,因此您不能使用接口拦截器 (InterfaceInterceptor),而必须使用虚拟方法拦截器,如下所示:

container.Configure<Interception>()
     .SetInterceptorFor<MyApiController>(new VirtualMethodInterceptor());

这将要求您创建要拦截 virtual 的操作方法。

请注意,您仍然可以通过InterfaceInterceptor 拦截注入到您的控制器(定义为接口)的其他依赖项。这是因为 Web API 系统会要求容器将它们解析为接口,而不是类。

【讨论】:

  • 谢谢 - 这很有意义且有效。有点遗憾,您必须将方法设为虚拟,但我想这并不重要。
  • 欢迎您。您可能想搜索一下是否有办法强制 Web API 框架请求 IMyApiController 而不是 MyApiController。不过,我的直觉告诉我可能没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 2013-06-17
  • 2011-02-26
相关资源
最近更新 更多