C# 在中介模式实现中将Ninject注入处理器以进行对象解析
我有一个内存泄漏的问题,我无法找到一个插头。它适用于桌面应用程序,而不是web,因此对象的生命周期比单个请求更长 我正在尝试实现这篇优秀博客文章中描述的体系结构- QueryProcessor类需要一个IOC容器,因为它在调用Process方法时解析具体类型。我的实现如下所示:C# 在中介模式实现中将Ninject注入处理器以进行对象解析,c#,ninject,heap-memory,C#,Ninject,Heap Memory,我有一个内存泄漏的问题,我无法找到一个插头。它适用于桌面应用程序,而不是web,因此对象的生命周期比单个请求更长 我正在尝试实现这篇优秀博客文章中描述的体系结构- QueryProcessor类需要一个IOC容器,因为它在调用Process方法时解析具体类型。我的实现如下所示: public sealed class QueryProcessor : IQueryProcessor, IDisposable { private readonly IKernel _container;
public sealed class QueryProcessor : IQueryProcessor, IDisposable
{
private readonly IKernel _container;
private bool _disposed;
public QueryProcessor(IKernel container)
{
_container = container;
}
//[DebuggerStepThrough]
public TResult Process<TResult>(IQuery<TResult> query)
{
var handlerType = typeof(IQueryHandler<,>).MakeGenericType(query.GetType(), typeof(TResult));
dynamic handler = (_container.Target as IKernel).Get(handlerType);
return handler.Handle((dynamic)query);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (disposing && !_disposed)
{
// dispose container ???
_disposed = true;
}
}
}
公共密封类查询处理器:IQueryProcessor,IDisposable
{
专用只读IKernel_容器;
私人住宅;
公共查询处理器(IKernel容器)
{
_容器=容器;
}
//[调试步骤至]
公共TResult进程(IQuery查询)
{
var handlerType=typeof(IQueryHandler).MakeGenericType(query.GetType(),typeof(TResult));
动态处理程序=(_container.Target as IKernel).Get(handlerType);
返回处理程序.Handle((动态)查询);
}
公共空间处置()
{
处置(真实);
总干事(本);
}
私有无效处置(bool处置)
{
如果(处置和!\u处置)
{
//处理容器???
_这是真的;
}
}
}
我遇到的问题是,如果我注入Ninject内核,这意味着QueryProcessor类在超出范围时不会得到垃圾收集,因为它维护对内核的引用
如果我使用它,并在内核上调用Dispose,我已经杀死了我的内核,并且应用程序没有更多的DI
如果我创建一个单独的内核并为QueryProcessor的每个实例注入它,那么Ninject在尝试解析具体类型时就会抛出一个异常——“错误加载Ninject组件ICache”。显然Ninject不喜欢超过1个内核
类是否有任何方法可以拥有一个成员并在垃圾收集之前释放该成员
我遇到的问题是,如果我注入Ninject内核,它
意味着QueryProcessor类在运行时不会被垃圾回收
超出范围,因为它维护对内核的引用
当没有任何对象引用该对象时,该对象有资格进行垃圾收集。该对象引用的其他对象并不重要。因此,可能您在错误的位置查找内存泄漏。我发现您没有注册IKernel的任何事件(这将创建一个从IKernels委托到您的对象的引用),因此如果没有任何其他内容引用您的QueryProcessor,它应该被垃圾收集。OK。我将做一两个实验,看看内核是否是罪魁祸首。好建议。我会用消去法来解决,你说得很对。我很高兴是这样,因为我对可到达物体的理解与你的解释一致。因此,我对内核应该受到责备的假设感到非常困惑。有一条漫长而复杂的道路使这个物体存活下来。事情发生在某个地方,我想装模作样,结果被抓住了。谢谢