4

我正在尝试使用结构映射进行一些基于属性的拦截,但我正在努力解决最后的松散端。

我有一个自定义注册表来扫描我的程序集,并且在此注册表中我定义了以下 ITypeInterceptor,其目的是匹配使用给定属性修饰的类型,然后在匹配时应用拦截器。该类定义如下:

public class AttributeMatchTypeInterceptor<TAttribute, TInterceptor> 
   : TypeInterceptor 
   where TAttribute : Attribute 
   where TInterceptor : IInterceptor
{
    private readonly ProxyGenerator m_proxyGeneration = new ProxyGenerator();

    public object Process(object target, IContext context)
    {
        return m_proxyGeneration.CreateInterfaceProxyWithTarget(target, ObjectFactory.GetInstance<TInterceptor>());
    }

    public bool MatchesType(Type type)
    {
        return type.GetCustomAttributes(typeof (TAttribute), true).Length > 0;
    }
}

//Usage
[Transactional]
public class OrderProcessor : IOrderProcessor{
}
...   
public class MyRegistry : Registry{
    public MyRegistry()
    {
         RegisterInterceptor(
             new AttributeMatchTypeInterceptor<TransactionalAttribute, TransactionInterceptor>());
         ...
    }
}

我正在使用 Castle.Core 中的 DynamicProxy 创建拦截器,但我的问题是从CreateInterfaceProxyWithTarget(...)调用返回的对象没有实现触发在结构映射中创建目标实例的接口(即 IOrderProcessor在上面的例子中)。我希望 IContext 参数会显示此接口,但我似乎只能掌握具体类型(即上面示例中的 OrderProcessor)。

我正在寻找有关如何使此方案工作的指导,方法是调用 ProxyGenerator 以返回一个将所有接口实现为目标实例的实例,通过从结构映射中获取请求的接口或通过某种其他机制。

4

1 回答 1

2

实际上,我有一些需要注意的地方,所以我将其发布为答案。诀窍是获取接口并将其传递给CreateInterfaceProxyWithTarget。我唯一的问题是我找不到一种方法来查询IContext关于它当前正在解析的接口,所以我最终只是在目标上查找对我有用的第一个接口。请参阅下面的代码

public class AttributeMatchTypeInterceptor<TAttribute, TInterceptor> : 
    TypeInterceptor
    where TAttribute : Attribute 
    where TInterceptor : IInterceptor
{
    private readonly ProxyGenerator m_proxyGeneration = new ProxyGenerator();

    public object Process(object target, IContext context)
    {
        //NOTE: can't query IContext for actual interface
        Type interfaceType = target.GetType().GetInterfaces().First(); 
        return m_proxyGeneration.CreateInterfaceProxyWithTarget(
            interfaceType, 
            target, 
            ObjectFactory.GetInstance<TInterceptor>());
    }

    public bool MatchesType(Type type)
    {
        return type.GetCustomAttributes(typeof (TAttribute), true).Length > 0;
    }
}

希望这可以帮助某人

于 2011-08-09T06:50:28.007 回答