我有一个Castler MVC应用程序,它使用Castler Windsor IoC在每个web请求的基础上创建Linq2SQL数据上下文。
出于某些我不能完全理解的原因,每次创建新的数据上下文(针对每个web请求)时,都会占用大约8k的内存,而不是释放--这不可避免地会导致OutOfMemory异常。
如果我强制垃圾回收,内存释放正常。
我的datacontext类非常简单:
public class DataContextAccessor : IDataContextAccessor
{
private readonly DataContext dataContext;
public DataContextAccessor(string connectionString)
{
dataContext = new DataContext(connectionString);
}
public DataContext DataContext { get { return dataContext; } }
}
用于实例化它的Windsor IoC webconfig如下所示:
<component id="DataContextAccessor"
service="DomainModel.Repositories.IDataContextAccessor, DomainModel"
type="DomainModel.Repositories.DataContextAccessor, DomainModel"
lifestyle="PerWebRequest">
<parameters>
<connectionString>
...
</connectionString>
</parameters>
</component>
有谁知道问题是什么,以及如何解决它吗?
发布于 2009-11-11 05:14:39
L2S DataContext实现了IDisposable。您的接口还必须实现它,并调用DataContext.Dispose(),以便Windsor知道有资源需要处理。
顺便说一句,小心Windsor/ By可能出现的问题:http://www.jeremyskinner.co.uk/2008/05/03/aspnet-mvc-controllers-windsor-and-idisposable/ http://www.nablasoft.com/Alkampfer/?p=105
发布于 2010-05-18 18:04:17
不,您的DataContextAccessor
不需要实现IDisposable
。Windsor足够聪明,可以处理这种情况,而不必对类进行任何修改。
然而,正如在其他答案中指出的那样,DataContext
确实实现了它,并且Windsor看到它并注册它以进行清理(以调用它的Dispose
方法)。
您需要做的是调用container.Release
并传递您的根服务(在本例中可能是DataContextAccessor
)。然后,Windsor将释放它和它的所有依赖项(它还将在DataContext
上调用Dispose
),内存将被释放。
如果你正在使用Windsor,考虑使用MVCContrib项目,它具有ASP.NET集成,可以为你处理组件的发布。
发布于 2009-11-11 06:28:29
据我所知,queen3是正确的,您的DataContextAccessor
类需要实现IDisposable
并从其.Dispose()
方法调用datacontext.Dispose()
。(免责声明:我没有和温莎城堡合作过。)
或者,我要做的是将您的DataContextAccessor
转换为一个DataContextFactory
,它只在您调用一个方法(例如GetContext()
)时创建DataContext
。然后你可以这样做:
using(DataContext context = myDataContextFactory.GetContext()) {
// Do whatever you want with the context
}
// Context is disposed here
您可能还想看看前面的这个问题:How do you reconcile IDisposable and IoC?
https://stackoverflow.com/questions/1710992
复制相似问题