Dans Google, je n'arrive pas à trouver un exemple d'événement d'interception sur un type proxy et cela ne semble pas fonctionner pour moi. Existe-t-il un moyen de le faire (par exemple, utiliser un IInterceptor lorsqu'un événement est appelé)?Interception d'événement avec Castle DynamicProxy
Répondre
Je fini par utiliser l'événement ComponentCreated, puis en ajoutant un gestionnaire d'événements dynamique avec un DynamicMethod pour accomplir ce que je voulais:
private static readonly MethodInfo internalPublishEventMethod =
typeof(EventPublisher).GetMethod("PublishEvent", BindingFlags.Static | BindingFlags.NonPublic);
private void Container_ComponentCreated(global::Castle.Core.ComponentModel model, object instance)
{
if (instance != null)
{
Type type = instance.GetType();
var eventPublisherAttribute = type.GetAttribute<EventPublisherAttribute>();
if (eventPublisherAttribute != null)
{
foreach (EventInfo ei in type.GetEvents())
{
if (eventPublisherAttribute.PublishAllEvents || ei.GetCustomAttributes(typeof(PublishedEventAttribute), false).Length > 0)
{
// emit an event handler
MethodInfo invoke = ei.EventHandlerType.GetMethod("Invoke");
Type[] parameters = invoke.GetParameters().Select(p => p.ParameterType).ToArray();
var method = new DynamicMethod(string.Empty, null, parameters, instance.GetType(),
true);
ILGenerator generator = method.GetILGenerator();
// sender
generator.Emit(OpCodes.Ldarg_0);
// args
generator.Emit(OpCodes.Ldarg_1);
// topic
generator.Emit(OpCodes.Ldstr, ei.Name);
generator.Emit(OpCodes.Call, internalPublishEventMethod);
generator.Emit(OpCodes.Ret);
Delegate d = method.CreateDelegate(ei.EventHandlerType);
ei.AddEventHandler(instance, d);
}
}
}
}
}
private static void PublishEvent(object sender, EventArgs e, string topic)
{
if (e != null)
{
// do stuff
}
}
J'en doute. Castle Dynamic Proxy fonctionne en interceptant les appels effectués sur le proxy. Les événements ne sont pas effectués sur le proxy. Ce sont des rappels gérés par le framework .NET.
C'est exact. Avec DP, vous pouvez intercepter des méthodes, y compris l'inscription à un événement et la désinscription, mais c'est tout. –
Merci, ma solution ci-dessous accomplit ce que je cherchais donc ce n'est pas nécessaire. – Jeff
- 1. Génération de proxy d'interface DynamicProxy Castle
- 2. Comment détecter si un Type est un DynamicProxy généré sans faire référence à Castle DynamicProxy?
- 3. Castle DynamicProxy a généré les noms de classes
- 4. Faire une interception avec structuremap
- 5. Pourquoi est-ce que j'obtiens une exception de réflexion "Invalid Internal state" avec Castle DynamicProxy?
- 6. Castle DynamicProxy IInterceptor ou ProxyGenerator doit-il être mis en cache?
- 7. Castle DynamicProxy: Comment proxy est égal lors de l'intermédiaire d'une interface?
- 8. Intercept uniquement des méthodes d'interface avec DynamicProxy
- 9. Propriétés d'interception avec Castle Windsor IInceptceptor
- 10. La manière la plus simple de vérifier si la méthode est implémentée automatiquement par Castle DynamicProxy
- 11. StructureMap avec interception et Castle.DynamicProxy
- 12. Interception onOptionsItemSelected
- 13. jquery interception
- 14. Flush avec Castle ActiveRecord
- 15. Interception Copier et coller avec AppleScript
- 16. fenêtre parent accélérateur interception
- 17. Interception ASP.NET Control OnInit
- 18. Une expérience avec Castle ActiveRecord?
- 19. Projet Castle ActiveRecord avec XML
- 20. Cascading avec Castle ActiveRecord HasAndBelongsToMany's
- 21. Interception de XHR
- 22. Interception nhibernate select query
- 23. UINavigationController interception - popViewControllerAnimated:
- 24. iPhone sdk appel interception
- 25. Interception de méthode Ruby
- 26. Interception d'e-mails .NET
- 27. Interception de message NServiceBus?
- 28. Comment plusieurs interfaces avec plusieurs classes peuvent-elles être fusionnées avec DynamicProxy?
- 29. Où se trouve le château dynamicproxy repo?
- 30. interception et l'unité des constructeurs
J'ai le même problème. Où id vous mettez ce gestionnaire d'événements? –
6 ans plus tard ... les événements sont câblés sur le noyau des conteneurs exposé par IKernelEvents. https://github.com/castleproject/Windsor/blob/master/docs/container-events.md – Konstantin