我正在尝试使用结构映射进行一些基于属性的拦截,但我正在努力解决最后的松散端。
我有一个自定义注册表来扫描我的程序集,并且在此注册表中我定义了以下 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 以返回一个将所有接口实现为目标实例的实例,通过从结构映射中获取请求的接口或通过某种其他机制。