在谷歌搜索中,我似乎無法找到代理類型攔截事件的例子,它似乎並沒有爲我工作。有沒有一種方法可以做到這一點(即,當事件被調用時使用IInterceptor)?城堡DynamicProxy攔截事件
1
A
回答
2
我結束了使用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
}
}
2
我對此表示懷疑。 Castle Dynamic Proxy通過攔截代理上的呼叫來工作。事件不是在代理上進行的。它們是.NET框架處理的回調。
+2
這是正確的。使用DP,您可以攔截方法,包括事件訂閱和取消訂閱,但就是這樣。 – 2010-06-04 22:04:54
+0
謝謝,我的解決方案完成了我所尋找的東西,所以這不是必需的。 – Jeff 2010-06-05 20:26:41
相關問題
- 1. 攔截只DynamicProxy
- 2. 防止被攔截的方法 - 城堡
- 3. 城堡溫莎攔截器的性能
- 4. 城堡溫莎攔截器 - 訂單?
- 5. 攔截器攔截不C#,城堡動態代理
- 6. 城堡dynamicproxy回購在哪裏?
- 7. 處理PropertyChanging /通過城堡的DynamicProxy
- 8. 城堡中的組件註冊後註冊攔截器
- 9. 在組件實例上調用城堡攔截器
- 10. Autofac + Castle DynamicProxy:攔截器的順序
- 11. 關閉簽約欲以城堡TypedFactoryFacility當我有問題城堡DynamicProxy
- 12. 統一2攔截相當於CreateInterfaceProxyWithoutTarget的城堡動態代理
- 13. 在windsor流行城堡中註冊多個攔截器
- 14. 城堡攔截生命週期和內存泄漏
- 15. 溫莎城堡攔截器選擇和掛鉤
- 16. 城堡溫莎攔截器上Caliburn查看模型
- 17. 私人/受保護方法的城堡溫莎攔截器
- 18. 具有流暢界面的城堡攔截器
- 19. 註冊DynamicProxy動態創建的城堡組件
- 20. 攔截聚合物事件
- 21. Sitefinity攔截頁面事件
- 22. 攔截JavaScript卸載事件
- 23. 通過iframe攔截事件
- 24. 如何攔截NotifyPropertyChange事件
- 25. 城堡攔截器在單元測試中不攔截MVC控制器上的方法
- 26. 代理NHibernate對象與城堡DynamicProxy燕子NH功能
- 27. 截取屬性與城堡溫莎IInterceptor
- 28. 城堡:我如何才能在日誌攔截器中獲得正確的ILogger?
- 29. 爲溫莎城堡中的所有接口實現註冊攔截器
- 30. 溫莎城堡:註冊兩個接口爲一個單用攔截
我遇到同樣的問題。你在哪裏把這個事件處理程序? – 2010-08-03 14:41:15
6年後...事件連接到由IKernelEvents公開的Containers內核。 https://github.com/castleproject/Windsor/blob/master/docs/container-events.md – Konstantin 2016-12-06 21:19:31