Question

Je suis en train de faire une interception basée sur les attributs à l'aide StructureMap mais je me bats pour attacher les dernières extrémités libres.

J'ai un registre personnalisé qui scanne mes ensembles et dans ce registre, je l'ai défini le ITypeInterceptor suivant dont le but est de faire correspondre les types décorées avec l'attribut donné et ensuite appliquer l'intercepteur en cas de correspondance. La classe est définie comme:

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>());
         ...
    }
}

J'utilise DynamicProxy du Castle.Core pour créer les intercepteurs, mais mon problème est que l'objet retourné par CreateInterfaceProxyWithTarget (...) appel ne met pas l'interface qui a déclenché la la création de l'instance cible dans StructureMap (c.-à-IOrderProcessor dans l'exemple ci-dessus). J'espérais que le paramètre IContext révélerait cette interface, mais je ne peux pas sembler obtenir une prise de type béton (à savoir BonCommande dans l'exemple ci-dessus).

Je cherche des conseils sur la façon d'avoir ce travail de scénario, que ce soit en appelant le ProxyGenerator pour retourner une instance qui implémente toutes les interfaces comme l'instance cible, en obtenant l'interface demandée de StructureMap ou par un autre mécanisme.

Était-ce utile?

La solution

En fait, je suis quelque chose de travailler avec une légère mise en garde donc je vais juste poster ce que la réponse. L'astuce est d'obtenir l'interface et passer que dans la CreateInterfaceProxyWithTarget . Mon seul problème était que je ne pouvais pas trouver un moyen d'interroger le IContext à propos de l'interface, il a été actuellement si je résout fini par regarder juste la première interface sur la cible qui a fonctionné pour moi. Voir ci-dessous le code

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;
    }
}

L'espoir que cela aide quelqu'un

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top