升级Unity容器会破坏拦截机制

时间:2018-06-22 21:23:22

标签: unity-container aop interceptor

我们最近将项目中的Microsoft Unity从3.5.1404版本升级到5.8.6。只需对我们的代码进行少量调整,此升级过程似乎就很容易了。它可以毫无问题地解决我们所有已注册的实例。但是,我们还使用Unity的拦截机制来缓存某些方法以AOP风格返回的结果。自升级以来,此缓存机制已失效,我们无法弄清原因。显然,当调用装饰方法时,不再调用我们的属性。

当前工作如下。我们这样注册拦截:

var container = new UnityContainer();
container.RegisterType<IService, Service>(some_lifetime);
container.AddNewExtension<Interception>();
container.Configure<Interception>()
         .SetInterceptorFor(typeof(IService), new InterfaceInterceptor());

在实现IService的Service类中,我们有一个用自定义Cache属性修饰的方法,如下所示:

public class Service : IService {
   [Cache(..)]
   public Result SomeMethod() {
      // Some code
   }
}

最后,我们的自定义Cache属性继承自Unity的HandlerAttribute:

public class CacheAttribute : HandlerAttribute
{
    // ctor

    public override ICallHandler CreateHandler(IUnityContainer container)
    {
        return new CacheCallHandler(container, and, some, more);
    }
}

以前在版本3.5.1404中调用方法 SomeMethod 时,首先调用该属性,但是从5.8.6版本开始,不再调用该属性。但是,代码可以编译。我们必须进行的更改才能使其编译,大部分是 usings 中的更改。就像Microsoft.Practices.Unity.InterceptionExtension更改为Unity.Interception.PolicyInjection.Policies

我们无法弄清楚为什么该机制不再起作用。即使在互联网上进行了广泛的研究之后,我们仍然无法找到一种方法来使它起作用。因此,任何建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

在尝试刷新一些旧代码时,我遇到了与您完全相同的情况。我可以使用它:

  • 更改:

    • config.SetInterceptorFor(myType, new InterfaceInterceptor()); for
    • config.SetInterceptorFor(myType, new TransparentProxyInterceptor());
  • 注册从HandlerAttribute继承的类

    • Container.RegisterType<MyHandlerAttribute>(new PerRequestLifeTimeManager());
  • 注册每种类型以使用特殊的InjectionMembers进行拦截:

Container.RegisterType<MyClassToBeIntercepted>(
    new Interceptor<TransparentProxyInterceptor>(),
    new InterceptionBehavior<PolicyInjectionBehavior>()
);