В googling Я не могу найти пример перехвата события на прокси-типа, и он, похоже, не работает для меня. Есть ли способ, которым я могу это сделать (например, использовать IInterceptor при вызове события)?Перехват события с замком DynamicProxy
ответ
я в конечном итоге с помощью события ComponentCreated, а затем добавить динамический обработчик событий с DynamicMethod сделать то, что я хотел:
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
}
}
Я сомневаюсь. Замок Dynamic Proxy работает, перехватывая вызовы, сделанные на прокси. События не выполняются на прокси-сервере. Это обратные вызовы, выполняемые платформой .NET.
Это правильно. С помощью DP вы можете перехватывать методы, включая подписку на события и отмену подписки, но это все. –
Спасибо, мое решение ниже выполняет то, что я искал, поэтому это необязательно. – Jeff
- 1. Перехват недвижимости с замком Виндзор IInterceptor
- 2. Перехват вызовов webpi2 с Виндзорским замком
- 3. Регистрация компонентов с замком, которые динамически создаются DynamicProxy
- 4. Proxying NHibernate Объекты с замком DynamicProxy ласточки NH-функциональность
- 5. Виндзорский замок DynamicProxy Перехват IInvocation Документация
- 6. AOP с перехватом Ninject, замком DynamicProxy и окном WPF: не удается найти ресурс XAML в DynamicProxy окна
- 7. Перехват NSMenu ключевые события
- 8. Перехват события выхода страницы
- 9. Полимерные события Перехват
- 10. Перехват события добавления DataGrid
- 11. Перехват HTTP-события с использованием JQuery
- 12. Перехват jTable события смены выбора
- 13. Занесенные имена классов DynamicProxy в Castle DynamicProxy
- 14. Log4Net с замком windsor
- 15. Промывка с замком ActiveRecord
- 16. Работа с внутренним замком
- 17. Переупорядочение инструкции с замком
- 18. многопоточных проблемы с замком
- 19. ReadStream с замком (NodeJS)
- 20. Перехват события выключения Windows Vista в C#
- 21. перехват события onload, запущенного браузером в watir
- 22. События HttpModule - перехват sharepoint перенаправляется на accessdenied.aspx
- 23. Перехват сеанса Начало события для всех приложений
- 24. Перехват и отмена события Click кнопки WinForms
- 25. Перехват события нокаутного щелчка, отправляющий неверные данные
- 26. Перехват нокаутом после события двойного щелчка
- 27. Расширяемость Visual Studio: перехват события вставки файла
- 28. .NET Windows Forms - перехват события Close X
- 29. Перехват события навигации браузера из плагина FireBreath
- 30. Контекстная привязка с замком Windsor
У меня такая же проблема. Где id вы помещаете этот обработчик событий? –
6 лет спустя ... события подключены к ядру контейнеров, выставленному IKernelEvents. https://github.com/castleproject/Windsor/blob/master/docs/container-events.md – Konstantin