Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在中介模式实现中将Ninject注入处理器以进行对象解析_C#_Ninject_Heap Memory - Fatal编程技术网

C# 在中介模式实现中将Ninject注入处理器以进行对象解析

C# 在中介模式实现中将Ninject注入处理器以进行对象解析,c#,ninject,heap-memory,C#,Ninject,Heap Memory,我有一个内存泄漏的问题,我无法找到一个插头。它适用于桌面应用程序,而不是web,因此对象的生命周期比单个请求更长 我正在尝试实现这篇优秀博客文章中描述的体系结构- QueryProcessor类需要一个IOC容器,因为它在调用Process方法时解析具体类型。我的实现如下所示: public sealed class QueryProcessor : IQueryProcessor, IDisposable { private readonly IKernel _container;

我有一个内存泄漏的问题,我无法找到一个插头。它适用于桌面应用程序,而不是web,因此对象的生命周期比单个请求更长

我正在尝试实现这篇优秀博客文章中描述的体系结构-

QueryProcessor类需要一个IOC容器,因为它在调用Process方法时解析具体类型。我的实现如下所示:

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。我将做一两个实验,看看内核是否是罪魁祸首。好建议。我会用消去法来解决,你说得很对。我很高兴是这样,因为我对可到达物体的理解与你的解释一致。因此,我对内核应该受到责备的假设感到非常困惑。有一条漫长而复杂的道路使这个物体存活下来。事情发生在某个地方,我想装模作样,结果被抓住了。谢谢