让我首先展示一下有效的方案:
我有一个HandlerAttribute,它使用InterfaceInterceptor与AOP一起工作,我这样注册:
public void RegisterType<TInterface, TClass>()
where TClass : TInterface
{
// My UnityContainer
this.container.RegisterType<TInterface, TClass>(new ContainerControlledLifetimeManager())
.Configure<Interception>()
.SetDefaultInterceptorFor<TInterface>(new InterfaceInterceptor());
}
具有HandlerAttribute的接口:
public interface IService<TId, TEntity>
where TId : IEquatable<TId>
where TEntity: AbstractEntity<TId> // Class that has a Id
{
[DatabaseTransaction] // The HandlerAttribute
void Update(TEntity entity);
}
因此,我创建了实现IService的MyService,并使用RegisterType方法注册。所以,之后我从myContainer调用Resolve方法传递IService,并使用我的方法更新截获的服务我的DatabaseTransactionAttribute:
public class MyService : IService<int, MyEntity>
{
}
后:
RegisterType<IService, MyService>()
一切正常,直到我创建实现IService的接口IMyService和实现IMyService的MyService。我做同样的步骤来注册和解决上面提到的IMyService接口...
public class IMyService : IService<int, MyEntity>
{
}
public class MyService : IMyService
{
}
后:
RegisterType<IMyService, MyService>()
问题是,当我在第二种情况下调用Update方法时,我的DatabaseTransactionAttribute不再拦截该方法,有人知道为什么吗?
我发现这个问题在某种程度上相关:Can a C# class inherit attributes from its interface?
那么,我必须在实现具有该属性的接口的接口中重新声明? OO
只有在属性位于Unity容器中注册的接口中时,拦截器才有效?
答案 0 :(得分:3)
AFAIK:
只有属性在接口中时,拦截器才有效 在团结容器中注册?
是
所以,我必须在
的接口implements扩展的接口中重新声明该属性 具有属性?
是