.NET内存分析/泄漏风险/Ninject/直接委托根

.NET内存分析/泄漏风险/Ninject/直接委托根,.net,asp.net,debugging,memory,ninject,.net,Asp.net,Debugging,Memory,Ninject,我正在分析一个使用Ninject进行DI的应用程序。随着时间的推移,我看到了BindingBuilder类的大量实例,该类用于定义容器中定义的对象 Ninject的“ToMethod”绑定用于定义容器中的所有对象。lamba中用于访问内核的上下文随后用于从容器中检索其他对象。例如: Bind<IService>() .ToMethod(ctx => new CustomService( ctx.Kernel.GetDefault<IOtherSer

我正在分析一个使用Ninject进行DI的应用程序。随着时间的推移,我看到了BindingBuilder类的大量实例,该类用于定义容器中定义的对象

Ninject的“ToMethod”绑定用于定义容器中的所有对象。lamba中用于访问内核的上下文随后用于从容器中检索其他对象。例如:

Bind<IService>()
    .ToMethod(ctx => new CustomService(
        ctx.Kernel.GetDefault<IOtherService>(), 
        ctx.Kernel.GetDefault<IAnotherService>()
    ))
    .InSingletonScope();
Bind()
.ToMethod(ctx=>新客户服务(
ctx.Kernel.GetDefault(),
ctx.Kernel.GetDefault()
))
.InSingletonScope();

BindingBuilder随时间增加是正常行为还是这些引用只存在一次?

ToMethod在
BindingBuilder
中为lambda表达式创建一个新的匿名类。您看到的不是
BindingBuilder
的实例,而是类似于
BindingBuilder+c__DisplayClass1

此外,您没有按预期使用Ninject。上面的绑定可以写得容易得多。让Ninject决定注入什么,而不是添加explizit定义

Bind<IService>().To<CustomService>.InSingletonScope();
Bind().To.InSingletonScope();

谢谢您的帮助。我们之所以这样做,是因为我们已经命名了我们特别想要注入的实例,所以我们可以为给定的接口定义两个具有不同名称的实现。我们如何让Ninject决定在这个场景中使用哪一个呢?这是一个完全不同的故事,取决于有多个实现的原因。这个问题的答案是没有,BindingBuilder没有内存泄漏。这很好,我想不会有。您希望看到通过BindingBuilder路由逐渐构建匿名类吗?您是否对命名实例有任何指导,以及注入这些实例的最佳方法。我以为我们使用的是推荐的方法,但它们可能是更好的方法?我希望每个使用ToMethod(或任何其他以lambda为参数的方法)的绑定都有一个新匿名类的单个实例.关于另一个问题,我成功地提出了一个新问题,其中包括为什么有多个实例以及您希望实现的目标。e、 g.这些不同的策略是由策略使用者的某些条件选择的,还是因为您希望以不同的方式部署它。。。。正如我所说的,没有一个解决方案,不同的情况下有很多解决方案。目前只是猜测而已。