问题标签 [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.
autofac - Autofac EnableInterfaceInterceptors 错误
我们在升级到 MVC3 后更新到 Autofac 2.4.4,并且EnableInterfaceInterceptors
在我们注册时收到异常。DependencyResolver.Current.GetService<ISite>()
直到被调用时才会出现异常。
例外:
登记:
注意:为了处理不同版本 Castle 中的冲突,我们在AutofacContrib.DynamicProxy2.dll
和上执行了 ILMerge Castle.Core.dll
。
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 性能不是一个很大的问题(在我的项目中),但是将它们组合在一起会导致性能大幅下降。
ioc-container - Ninject:当为 AoP 代理类型时可以使用注入构造函数吗?
我正在使用 Ninject 2 做一个项目,一个问题困扰着我:
如果要拦截类型上的方法,则需要将其包装到代理中(具体为城堡动态代理)。除非所述类型具有无参数构造函数,否则代理创建将失败。如果有,则在从内核解析类型实例时使用此构造函数。
不幸的是,这意味着我的带参数的注入构造函数被忽略了,我不得不求助于属性注入。我有些不愿意将我的域类型与属性上的 [Inject] 属性结合起来。
有没有办法使用 Ninject 将注入构造函数与 AoP 代理一起使用?
c# - 在 Castle.DynamicProxy 中是否可以在初始化后更改 mixin 值?
我注意到 DynamicProxy 对象可以实现一个IChangeProxyTarget接口,它允许您执行类似((IChangeProxyTarget)myProxyObj).ChangeInvocationTarget(newTarget)
.
有没有办法类似地更改 DynamicProxy 对象上的 mixin 实现?显然,这比以我没有完全考虑过的方式更改目标更复杂和细致入微(由于不同的接口实现、mixins 的多样性等),但这个概念并非完全不可想象。
或者缺乏这一点,以合理的性能方式实现这一目标的任何想法?我有一些关于破解这个的理论想法,但它似乎非常非常复杂:
Action<object, object> DoSwitch
定义一个带有属性的 MixinSwitcher 类(以及随附的 IMixinSwitcher 接口)- 在创建 DP 对象 `MixinSwitcher mixinSwitcher = new MixinSwitcher(); 时混合这个实例 proxyGenerationOptions.AddMixinInstance(mixinSwitcher);
- 创建 DP 对象
var dpObj = proxyGenerator.Create...
- 确保将 IMixinSwitcher 添加到接口以实现 - 使用反射从查找相关的 mixin MemberInfo
dpObj.Gettype()
- 使用 System.Reflection.Emit 为该属性生成一个快速设置器。
- 放
mixinSwitcher.DoSwitch = (SRE setter method here)
- ((IMixinSwitcher)dpObj).DoSwitch(dpObj, newMixinValue)
- 利润……还是大脑融化?
可以对第 1 步类进行泛化以允许它针对特定/多个实现;缓存步骤 4-5 以获得额外的性能,并且可以清理一般的步骤 1 实现。
即便如此,我也不否认这很疯狂——还有更好的方法吗?
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 实现会很好) .
c# - Castle 拦截器:如何为所有注册类型添加拦截器?
我正在一一注册几种类型:
有没有办法为已注册的所有类型的程序集注册一个拦截器?我不想按照惯例注册所有类型AllTypes
。我只想添加一个拦截器而不写
无数次。
谢谢!
c# - .net 动态代理的成本
使用动态代理的成本是多少?
我不想用接口实现使我的项目混乱,所以我正在考虑使用由一些 3rd 方库(如 LinFu、Castle、Unity 等)创建的动态代理。它们是为每个接口生成一个实例,还是每次调用都得到一个实例。
它是一个网络应用程序,所以从长远来看,性能问题是什么。
我也在使用 EF 4.1(目前是 CTP5),所以如果确实创建了代理类本身,这让我想知道我是否可以使用 EF 自己的动态代理创建工具。
PS是的,我的接口是由具体类以及其他接口和基类实现的,但有时我只需要它的接口部分,而不需要具体类附带的额外内容。
所有接口仅声明 EF4.1 POCO 的一部分。所以只是吸气剂和二传手。
automapper - automapper 代理基类型
如何在 Automapper 上设置 BaseTypeForInterfaceProxy。
c# - 根据创建的设施选择拦截器 ILogger
我有两种类型的拦截器:LoggingWithDebugInterceptor 和 LoggingInterceptor。
我正在使用 Castle Logging Facility,我想知道如何编写一个选择器,该选择器根据 Castle Logging Facility 创建的 ILogger 的 IsDebugEnabled 属性在我的容器上为任何实现 ILoggable 的类型注册一个拦截器。
怎么做到呢?
unit-testing - 如何对拦截器进行单元测试?
我想为拦截Loggable基类(实现ILoggable)的拦截器编写一些单元测试。Loggable
基类没有可调用
的方法,它仅用于由日志记录工具初始化。
据我了解,我应该:
- 模拟ILoggable和ILogger
- 初始化日志记录工具
- 在上面注册我的拦截器
- 调用模拟的ILoggable的一些方法
问题是我的ILoggable接口没有可调用的方法,因此不会截获任何内容。
什么是在这里采取行动的正确方式?
我应该手动模拟ILoggable并添加一个存根方法来调用吗?
另外,我也应该嘲笑容器吗?
我正在使用起订量和 NUnit。
编辑:
这是我的拦截器实现供参考: