gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:32:50 26 4
gpt4 key购买 nike

我们最近将项目中的 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 开始不再调用该属性。但是,代码确实可以编译。我们必须对其进行编译才能进行的更改主要是对使用 的更改。比如 Microsoft.Practices.Unity.InterceptionExtension 变成了 Unity.Interception.PolicyInjection.Policies

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

最佳答案

我在尝试刷新一些遗留代码时遇到了与您完全相同的情况。我得到它的工作:

  • 改变:

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

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

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

关于unity-container - 升级 Unity 容器会破坏拦截机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50995769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com