Я пытаюсь сделать некоторый перехват на основе атрибутов, используя Structuremap, но я пытаюсь связать последние свободные концы.
У меня есть собственный Реестр, который сканирует мои сборки, и в этом Реестре я определил следующий 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>());
...
}
}
Я использую DynamicProxy из Castle.Core для создания перехватчиков, но моя проблема в том, что объект, возвращенный из вызова CreateInterfaceProxyWithTarget (...) , не реализует интерфейс, который инициировал создание целевого экземпляра в структуре карты (т.е. IOrderProcessor в приведенном выше примере). Я надеялся, что параметр IContext откроет этот интерфейс, но я могу только удержать конкретный тип (т.е. OrderProcessor в приведенном выше примере).
Я ищу руководство о том, как заставить этот сценарий работать, либо вызывая ProxyGenerator для возврата экземпляра, который реализует все интерфейсы в качестве целевого экземпляра, либо получая запрошенный интерфейс из структуры структуры, либо через какой-либо другой механизм.