c# – AOP拦截属性

所以,我有这个问题,似乎没有人能够提供帮助.所以,不要继续抨击,我会把它扔到那里,以换取皮肤这种特殊猫的替代方法.

我目前有以下内容:

public interface ICustomerService
{
    Customer GetCustomer(int id);
}

public class CustomerService : ICustomerService
{
    public Customer GetCustomer(int id)
    {
        ...
    }
}

…并且使用Unity我有IOC设置,同时配置拦截,如:

IUnityContainer ioc = new UnityContainer();
ioc.RegisterType<ICustomerService, CustomerService>()
    .Configure<Interception>()
    .SetInterceptorFor<ICustomerService>(new InterfaceInterceptor());

我想要实现的是能够在界面中放置属性,如下所示:

public interface ICustomerService
{
    [Log]
    Customer GetCustomer(int id);
}

……定义如下:

public class LogAttribute: HandlerAttribute
{
    public override ICallHandler CreateHandler(IUnityContainer container)
    {
        return new LogHandler();
    }
}  

…然后在LogHandler类中执行我想要的所有日志记录:

public class LogHandler : ICallHandler
{
    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
        ... log stuff
    }
}

我想要实现的是一个跟踪/日志记录系统,其中处理程序记录调用namespace.class.methodname的内容,以及调用它的父namespace.class.methodname.我试过没有成功使用“输入”IMethodInvocation参数来获取我想要的信息,问题是,输入返回“ICustomerService”接口,同时检查父帧的堆栈帧返回父实现的类(例如.ServiceService)意味着当我尝试使用namespace.class.methodname作为实体ID创建树结构时,ID和parentID不匹配.

将参数放入[Log]属性也不会真正起作用,因为我可以放在那里?如果我输入接口名称,我仍然遇到与上面相同的问题,其中1的ID是接口而父接口是实现类.并且,我不能将实现类名称放在接口的属性中,因为它首先破坏了具有接口的目的!

所以,这就是困境.谁有新鲜的想法?

最佳答案 我最终使用PostSharp来实现这样的日志记录.
http://www.postsharp.org

点赞