我们最近将项目中的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
。
我们无法弄清楚为什么该机制不再起作用。即使在互联网上进行了广泛的研究之后,我们仍然无法找到一种方法来使它起作用。因此,任何建议将不胜感激!
答案 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>()
);