当我实现一个使用它的接口时,HandlerAttribute拦截是否可能?

时间:2012-01-24 18:46:42

标签: c# .net attributes unity-container interceptor

让我首先展示一下有效的方案:

我有一个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容器中注册的接口中时,拦截器才有效?

1 个答案:

答案 0 :(得分:3)

AFAIK:

  

只有属性在接口中时,拦截器才有效   在团结容器中注册?

  

所以,我必须在 implements 扩展的接口中重新声明该属性   具有属性?

的接口