问题标签 [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 投票
1 回答
669 浏览

autofac - Autofac EnableInterfaceInterceptors 错误

我们在升级到 MVC3 后更新到 Autofac 2.4.4,并且EnableInterfaceInterceptors在我们注册时收到异常。DependencyResolver.Current.GetService<ISite>()直到被调用时才会出现异常。

例外:

登记:

注意:为了处理不同版本 Castle 中的冲突,我们在AutofacContrib.DynamicProxy2.dll和上执行了 ILMerge Castle.Core.dll

0 投票
2 回答
2926 浏览

performance - Autofac:使用 DynamicProxy 时提高性能的技巧?

我今天才开始使用 DynamicProxy2。并发现它导致性能显着下降。

请参阅下面的代码。Test1 比 Test2 慢 10 倍。

使用 DynamicProxy 时提高性能的任何提示?

更新:

在我的机器上,Test1 大约需要 45 秒,Test2 大约需要 4.5 秒。阅读Krzysztof Koźmic的回答后,我尝试将NotifyPropertyChangedInterceptor放入单例范围:

这为我节省了大约 4 秒。现在 Test1 大约需要 41 秒。

更新 2:

Test3 在我的机器上大约需要 8.3 秒。所以看起来单独使用 Autofac 或 DynamicProxy 性能不是一个很大的问题(在我的项目中),但是将它们组合在一起会导致性能大幅下降。

0 投票
1 回答
713 浏览

ioc-container - Ninject:当为 AoP 代理类型时可以使用注入构造函数吗?

我正在使用 Ninject 2 做一个项目,一个问题困扰着我:

如果要拦截类型上的方法,则需要将其包装到代理中(具体为城堡动态代理)。除非所述类型具有无参数构造函数,否则代理创建将失败。如果有,则在从内核解析类型实例时使用此构造函数。

不幸的是,这意味着我的带参数的注入构造函数被忽略了,我不得不求助于属性注入。我有些不愿意将我的域类型与属性上的 [Inject] 属性结合起来。

有没有办法使用 Ninject 将注入构造函数与 AoP 代理一起使用?

0 投票
1 回答
346 浏览

c# - 在 Castle.DynamicProxy 中是否可以在初始化后更改 mixin 值?

我注意到 DynamicProxy 对象可以实现一个IChangeProxyTarget接口,它允许您执行类似((IChangeProxyTarget)myProxyObj).ChangeInvocationTarget(newTarget).

有没有办法类似地更改 DynamicProxy 对象上的 mixin 实现?显然,这比以我没有完全考虑过的方式更改目标更复杂和细致入微(由于不同的接口实现、mixins 的多样性等),但这个概念并非完全不可想象。

或者缺乏这一点,以合理的性能方式实现这一目标的任何想法?我有一些关于破解这个的理论想法,但它似乎非常非常复杂:

  1. Action<object, object> DoSwitch定义一个带有属性的 MixinSwitcher 类(以及随附的 IMixinSwitcher 接口)
  2. 在创建 DP 对象 `MixinSwitcher mixinSwitcher = new MixinSwitcher(); 时混合这个实例 proxyGenerationOptions.AddMixinInstance(mixinSwitcher);
  3. 创建 DP 对象var dpObj = proxyGenerator.Create...- 确保将 IMixinSwitcher 添加到接口以实现
  4. 使用反射从查找相关的 mixin MemberInfodpObj.Gettype()
  5. 使用 System.Reflection.Emit 为该属性生成一个快速设置器。
  6. mixinSwitcher.DoSwitch = (SRE setter method here)
  7. ((IMixinSwitcher)dpObj).DoSwitch(dpObj, newMixinValue)
  8. 利润……还是大脑融化?

可以对第 1 步类进行泛化以允许它针对特定/多个实现;缓存步骤 4-5 以获得额外的性能,并且可以清理一般的步骤 1 实现。

即便如此,我也不否认这很疯狂——还有更好的方法吗?

0 投票
2 回答
1346 浏览

c# - AOP 分离横切关注点

我正在尝试开始利用面向方面的编程来完成重复性任务。我不确定如何分离关注点。我正在使用 C# 和 AOP 我正在使用 Castle.DynamicProxy (使用 Autofac 的 InterceptedBy 功能),但我希望这个问题的答案可以是适用于其他 AOP 解决方案的足够普遍的建议(也许你可以说服我切换到不同的 AOP 解决方案)。

例如,我有类似以下拦截器的东西,它拦截对一个类的所有方法调用。它目前有两个问题:调用方法时,(1)测量调用花费了多长时间,以及(2)在调用之前和之后记录方法的名称。

我有一种压倒性的感觉,这里的时间问题(测量方法调用花费了多长时间)应该与日志记录问题(写入日志文件)分开,因为......嗯,它们是独立的问题。我正在考虑做这样的事情,但我不确定如何进行排序或将callTime变量放在哪里:

基本上我认为这里需要发生的是,不知何故,TimingInterceptor需要直接拦截方法,然后LoggingInterceptor需要环绕它。

人们使用什么方法来确保这些问题会以正确的顺序发生?我是否链接拦截器,让 LoggingInterceptor 拦截 TimingInterceptor 的 Intercept 方法?[InterceptOrder(1|2|3|...)]或者我是否在拦截器类上添加了某种属性?或者我可以[InterceptAfter(typeof(TimingInterceptor))]在 LoggingInterceptor 上放置类似的东西吗?

除了使用线程局部变量来跟踪调用时间,还有更好的选择吗?是的,我希望这是线程安全的。我在想将这个变量保留在堆栈上可能是首选,但我不确定 LoggingInterceptor 如何在不引入过多耦合的情况下获得 TimingInterceptor 的句柄(如果能够在不重新编译 LoggingInterceptor 的情况下切换 TimingInterceptor 实现会很好) .

0 投票
2 回答
2741 浏览

c# - Castle 拦截器:如何为所有注册类型添加拦截器?

我正在一一注册几种类型:

有没有办法为已注册的所有类型的程序集注册一个拦截器?我不想按照惯例注册所有类型AllTypes。我只想添加一个拦截器而不写

无数次。

谢谢!

0 投票
2 回答
977 浏览

c# - .net 动态代理的成本

使用动态代理的成本是多少?

我不想用接口实现使我的项目混乱,所以我正在考虑使用由一些 3rd 方库(如 LinFu、Castle、Unity 等)创建的动态代理。它们是为每个接口生成一个实例,还是每次调用都得到一个实例。

它是一个网络应用程序,所以从长远来看,性能问题是什么。

我也在使用 EF 4.1(目前是 CTP5),所以如果确实创建了代理类本身,这让我想知道我是否可以使用 EF 自己的动态代理创建工具。

PS是的,我的接口是由具体类以及其他接口和基类实现的,但有时我只需要它的接口部分,而不需要具体类附带的额外内容。

所有接口仅声明 EF4.1 POCO 的一部分。所以只是吸气剂和二传手。

0 投票
0 回答
417 浏览

automapper - automapper 代理基类型

如何在 Automapper 上设置 BaseTypeForInterfaceProxy。

0 投票
1 回答
122 浏览

c# - 根据创建的设施选择拦截器 ILogger

我有两种类型的拦截器:LoggingWithDebugInterceptor 和 LoggingInterceptor。
我正在使用 Castle Logging Facility,我想知道如何编写一个选择器,该选择器根据 Castle Logging Facility 创建的 ILogger 的 IsDebugEnabled 属性在我的容器上为任何实现 ILoggable 的类型注册一个拦截器。
怎么做到呢?

0 投票
3 回答
6219 浏览

unit-testing - 如何对拦截器进行单元测试?

我想为拦截Loggable基类(实现ILoggable)的拦截器编写一些单元测试。Loggable
基类没有可调用 的方法,它仅用于由日志记录工具初始化。 据我了解,我应该:

  1. 模拟ILoggableILogger
  2. 初始化日志记录工具
  3. 在上面注册我的拦截器
  4. 调用模拟的ILoggable的一些方法

问题是我的ILoggable接口没有可调用的方法,因此不会截获任何内容。
什么是在这里采取行动的正确方式?
我应该手动模拟ILoggable并添加一个存根方法来调用吗?
另外,我也应该嘲笑容器吗?

我正在使用起订量和 NUnit。
编辑:
这是我的拦截器实现供参考: