我遇到了一个问题,当使用Castle Windsor和拦截器时,我的程序会耗尽内存。它可以使用以下代码重现:
public interface ITest{}
public class Test : ITest {}
class TestInterceptor:IInterceptor {
public void Intercept(IInvocation invocation) {}
}
class Program {
static void Main(string[] args) {
while(true) {
using(var container = new WindsorContainer()) {
container.Register(Component.For<TestInterceptor>());
container.Register(Component.
For<ITest>().
ImplementedBy<Test>().
Interceptors(
InterceptorReference.ForType<TestInterceptor>()
).Anywhere);
var tst = container.Resolve<ITest>();
}
}
}
}
这就是内存使用的发展方式:
所以让我失望的是,我认为有一个非托管代码内存泄漏,但经过大量调试后我发现问题出在拦截器prxoy生成:一个新的(动态)程序集与代理类型在每次解析时都会引入运行时:
现在,我想你可以通过
来解决这个问题ProxyGenerator
自己生成代理并使用UsingFactoryMethod
生成实例的方式(我现在这样做)这让我有三个问题:
谢谢。
答案 0 :(得分:3)
我读过这是这样做的首选方式,并不完全清楚为什么
首选单个容器,因为:
答案 1 :(得分:1)
我今天刚遇到同样的问题。要回答原帖中的#3,性能计数器[.NET Clr Loading - &gt;由于加载了动态代理类型,运行代码片段时,当前程序集]会显示线性增加的程序集数。
答案 2 :(得分:0)
仔细阅读the documentation。 使拦截器始终处于暂态状态。
正确的代码是:
public interface ITest{}
public class Test : ITest {}
class TestInterceptor:IInterceptor {
public void Intercept(IInvocation invocation) {}
}
class Program {
static void Main(string[] args) {
while(true) {
using(var container = new WindsorContainer()) {
container.Register(Component.For<TestInterceptor>().LifestyleTransient());
container.Register(Component.
For<ITest>().
ImplementedBy<Test>().
Interceptors(
InterceptorReference.ForType<TestInterceptor>()
).Anywhere);
var tst = container.Resolve<ITest>();
}
}
}
}