问题标签 [castle-dynamicproxy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1470 浏览

c# - 提高 Castle 的 DynamicProxy 的性能?

我目前正在尝试实现一个 AOP 系统,以向对象的修饰属性添加自动审计(由 的扩展版本完成INotifyPropertyChanged)。自动审核包含 propertyName 它的旧值和新值。

我目前正在使用 Castle 的 DynamicProxy2,因为有关于如何使用该工具的优秀教程(即这个:: http://kozmic.pl/archive/2009/04/27/castle-dynamic-proxy-tutorial.aspx ) . 我为每个为该类型装饰的属性生成一个委托。表达式树生成如下内容:: (注意我认为这比粘贴我的表达式树代码更容易,因为我的代码依赖于类型安全的反射库和许多静态变量)

然后我有一个自定义选择器,它选择了DelegatedInterceptor(一个实现 IInterceptor 的类,它的 Intercept 方法只是为了调用委托。我还有一个自定义钩子,它只选择我计划委托的属性(所以我避免了代理 get 方法)。

不幸的是,即使采取了所有这些预防措施,我仍然看到每个属性集的性能都会受到重大影响(手动执行该逻辑大约需要 0.4 个滴答声,如果我使用动态代理执行该逻辑大约需要 2.2 个滴答声,如果我必须这样做则需要 2.8 个滴答声混合逻辑,INotifyAuditedChange并引发事件)。这不会那么糟糕,但作为我的要求的一部分,我正在查看大量正在修改的对象。

不幸的是,我使用 typebuilder 的计划失败了(用 Reflection.Emit 编写代码太难了,显然 CompileToMethod 不能用于实例方法),我是否缺少一些技巧来提高 DynamicProxy2 的性能?

0 投票
2 回答
784 浏览

nhibernate - Castle DynamicProxy 生成的类名

有谁知道是否可以控制通过 Castle DynamicProxy 生成的类型的名称?我希望利用持久化 Castle 生成的程序集的能力,为我的项目添加一些具有某些特定功能的附加类,但我希望能够控制这些生成的代理类型的名称。任何帮助将不胜感激。

我实际上计划保留这些类的实例以及作为 NHibernate 代理源的原始类的实例。因此,我需要这些名称在多代程序集中保持一致。

0 投票
1 回答
814 浏览

castle-dynamicproxy - 如何使用 DynamicProxy 合并具有多个类的多个接口?

假设我们有一个从 ICatBase 和 ICatExtension 派生的接口 ICat,如下所示。对于这两个不同的接口,可以使用 CatBase 和 CatExtension 实现。如何使用 Castle 的 DynamicProxy 将这些合并到 ICat 的实例中?

是否可以创建一个代理,其中 ICatExtension 由 CatExtension 实现,而 ICatBase 由拦截器“实现”?如何做到这一点?

编辑

我一直在尝试使用 mixins 来完成这项工作,但下面的代码会导致 NotImplementedException。

这是一个 DynamicProxy2 错误:没有为没有目标的方法“Void set_Name(System.String)”指定拦截器。当调用没有目标的方法时,没有“继续”的实现,拦截器有责任模仿实现(设置返回值、输出参数等)

我可以创建一个自定义拦截器来拦截调用并调度到正确的接口,但我觉得必须有一个更简单/更好的方法。我对么?

编辑#2

谢谢你,克日什托夫!使用下面的行是解决方案。

编辑#3

作为最后一步,我已经配置了一个 Windsor 容器来从这个示例中创建代理。我能够做到这一点的唯一方法是指定名称“Cat”并通过指定名称并ICat随后转换为接口来解析 System.Object 的实例。

有没有更优雅的方法,我可以只向容器询问 ICat 实例,而不参考特定名称?

0 投票
1 回答
81 浏览

.net - 检查方法是否由 Castle DynamicProxy 自动实现的最简单方法

我正在寻找最简单的方法来检查我的代理上的方法是否已由 DynamicProxy 自动实现。也就是说,假设在注册我的组件时,我添加了一些 AdditionalInterfaces,并且在我的拦截器中,如果该接口在代理上自动实现,我只想拦截该方法,并且如果我调用 .Proceed() 只会抛出 NotImplementedException . 我可以想出一些粗略的方法来使用 ComponentModel 进行检查,但我希望可能有一些简单/直接的方法。

谢谢!

0 投票
0 回答
1380 浏览

c# - 温莎城堡拦截器选择器和挂钩

我正在温莎城堡做一些项目,我在配置文件中遇到了一些拦截器钩子问题,我创建了一个类IProxyGenerationHook

我要做的就是拦截名称以“Save”开头的方法,并将它们动态地挂接到配置文件中。另外,在配置文件中,我有以下内容:

我想我在配置文件中做错了什么。有任何想法吗?

0 投票
0 回答
437 浏览

.net - Castle Windsor ProxyGenerationException

我在尝试代理实现同一通用接口的两种不同通用形式的接口(无目标)时遇到以下错误。

所以我有:

我收到以下错误:

有什么建议么?有解决方法吗?

谢谢。

0 投票
4 回答
3500 浏览

structuremap - 拦截方法调用以增加功能的最简单方法是什么?

假设我有一个返回Posts 列表的存储库。存储库接口有一个GetAll()方法可以执行它的建议。

现在按照我不应该将域逻辑放入存储库的理论,我想拦截对具体GetAll()方法的调用,以便我可以将以下逻辑添加到GetAll()结果中:

我想拦截它的原因是因为(1)我不想让客户端记住调用扩展方法(OrderByDescending或一些无用的包装器),我希望每次都调用它并且(2)我不希望我的所有具体实现都必须记住对GetAll()结果进行排序-我希望将此逻辑放在任何存储库外部的单个位置。

最简单的方法是什么?

我已经在使用StructureMap,所以如果我可以用它拦截它可能是一个低成本的选择。但我不认为 SM 拦截方法调用,只是对象实例的创建?

我需要使用代理或混合模式吗?我需要全力以赴使用 Castle Dynamic Proxy吗?还是我应该考虑另一种方法或组合?

我对我上面的特定示例的具体建议非常感兴趣。我是 AOP 的新手,所以请温柔一点。

0 投票
1 回答
1460 浏览

aop - AOP with Autofac and DynamicProxy2

I'm using Autofac with DynamicProxy2 to intercept my classes like this

This will intercept all methods on given interface.

Is there any way to intercept only particular methods of the interface ?

0 投票
1 回答
918 浏览

c# - 没有接口的温莎城堡拦截器?

使用 Castle Windsor 进行 DI,我有两个实现相同接口的类;除此之外还有一些自己的方法和属性。我正在使用 Castle DynamicProxy 并创建了一个拦截器,它将通过 Castle.Facilities.LoggingLoggingFacility 使用 Log4Net 进行一些日志记录。

当调用该方法时,日志文件整齐地记录通过接口实现的每个方法。在下面的示例代码中,方法 Foo() 在调用时会被记录,但方法 LogMeToo() 不会,因为它不是 IFoo 实现的一部分。

我还希望在调用时记录其他未实现接口的方法。这是可能的,如果是这样:如何?

PF C# 4.0

0 投票
1 回答
2179 浏览

logging - 尝试使用 DynamicProxy 为 StructureMap 制作日志拦截器

我正在尝试记录从 UI(DNN 模块)到它使用的一些各种服务的调用,以分析人们如何与站点交互。我正在使用 StructureMap 2.5.3.0 和 Log4Net

我在单个类/实例对上运行良好,但我必须配置如下:

两次IRegService感觉有点乱,但我可以忍受。

日志记录是这样实现的:

这可行,但有几个问题:

  1. 我必须手动配置每个服务 <-> 接口对
  2. 我只想在从 UI 调用服务时连接日志记录

我试图通过为 StructureMap 实现 TypeInterceptor 来解决这个问题:

但是我遇到了一个问题,即调用Process给我一个不实现构建上下文定义的接口的类。这导致不得不改变InterfaceLoggerto

永远不会到达断点return interfaceProxy;,这表明context.BuildStack.Current.RequestedType没有返回正确的接口。奇怪的是,我所有的课程似乎都被正确注入了。

此外,即使这有效,我仍然会遇到只想拦截来自 UI 层的调用的问题。

我正在寻找我的前两个问题的方法,以及我做错了什么TypeInterceptor