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

本文关键字:处理器 对象 注入 模式 实现 Ninject | 更新日期: 2023-09-27 18:13:14

我有一个内存泄漏问题,我不能找出一个插头。它是针对桌面应用程序的,而不是web应用程序,所以对象的生命周期比单个请求长。

我正在尝试实现这篇优秀博客文章中描述的架构- https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=92

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;
        }            
    }
}

我遇到的问题是,如果我注入Ninject内核,这意味着QueryProcessor类在超出作用域时不会被垃圾收集,因为它维护对内核的引用。

如果我处理它,并在内核上调用Dispose,我已经杀死了我的内核,并且没有更多的DI用于应用程序。

如果我创建一个单独的内核并为QueryProcessor的每个实例注入它,那么Ninject在试图解析一个具体类型时就会抛出一个异常- " Error loading Ninject component ICache " 。显然Ninject不喜欢超过1个内核。

是否有一种方法可以让类拥有一个成员,并在它被垃圾收集之前释放该成员?

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

我遇到的问题是,如果我注入Ninject内核,它意味着QueryProcessor类在运行时不会被垃圾收集超出作用域,因为它维护一个对内核的引用。

当没有对象引用该对象时,该对象符合垃圾收集条件。这个对象引用的其他对象无关紧要。因此,也许您在错误的地方寻找内存泄漏。我看到你没有注册IKernel的任何事件(这将创建一个从IKernel委托到你的对象的引用),所以如果没有其他东西引用你的QueryProcessor,它应该被垃圾收集。