C# 在内核本身中注册Ninject内核可以吗?

C# 在内核本身中注册Ninject内核可以吗?,c#,ninject,inversion-of-control,C#,Ninject,Inversion Of Control,我有一个麻烦的Windows服务(),我正在考虑创建一个自定义作用域工厂,以便在每次服务运行时生成一个新的作用域 我计划将内核注入这个工厂,这样它就可以在每次勾选时为服务返回一个新的作用域,并在每次勾选后销毁/释放该作用域 为了方便起见,我计划将其添加到我的RegisterServices()方法中: kernel.Bind().ToConstant(内核) 我的自定义范围工厂如下所示: public class CustomScopeFactory : ICustomScopeFactory

我有一个麻烦的Windows服务(),我正在考虑创建一个自定义作用域工厂,以便在每次服务运行时生成一个新的作用域

我计划将内核注入这个工厂,这样它就可以在每次勾选时为服务返回一个新的作用域,并在每次勾选后销毁/释放该作用域

为了方便起见,我计划将其添加到我的RegisterServices()方法中:

kernel.Bind().ToConstant(内核)

我的自定义范围工厂如下所示:

public class CustomScopeFactory : ICustomScopeFactory
{
    private readonly IKernel kernel;

    public CustomScopeFactory(IKernel kernel)
    {
        this.kernel = kernel;
    }

    public ICustomScope CreateScope()
    {
        return kernel.Get<ICustomScope>();
    }

    public void DisposeScope(ICustomScope scope)
    {
        kernel.Release(scope);
    }
}
公共类CustomScopeFactory:ICCustomScopeFactory
{
私有只读IKernel内核;
公共CustomScopeFactory(IKernel内核)
{
this.kernel=内核;
}
公共ICustomScope CreateScope()
{
返回kernel.Get();
}
public void DisposeScope(ICCustomScope范围)
{
内核发布(范围);
}
}

我通常不考虑在内核中注册内核或注入内核,但在这种情况下,我认为这是一个有效的用例。

那么,在内核本身中注册Ninject内核可以吗?如有任何想法或选择,将不胜感激

那么,在内核本身中注册Ninject内核可以吗

是的,这没有问题。将内核注入类是很好的,只要这些类位于。将内核注入到位于组合根外部的类会导致,而注入到位于组合根内部的类则是

那么,在内核本身中注册Ninject内核可以吗


是的,这没有问题。将内核注入类是很好的,只要这些类位于。将内核注入到位于组合根外部的类会导致,而注入到位于组合根内部的类则是。

您不需要注册
IKernel
。对于任何容器创建的具有
IKernel
依赖项(构造函数、字段或属性)的类,它都会自动注入。

您不需要注册
IKernel
。它是为任何容器创建的类自动注入的,这些类具有
IKernel
依赖项(构造函数、字段或属性)。

我认为这与普通的服务定位器没有任何区别。。因为你在注射容器本身。您的替代方法是注入
idependencysolver
或类似的东西。。使其独立于容器(如果这正是您的目标)。您可以使用
IResolutionRoot
接口,而不是
IKernel
接口。我想它已经注册了,所以你甚至不需要为它创建绑定。@BatteryBackupUnit使用
IResolutionRoot
而不是
IKernel
,有什么好处?@Kevin Kuszyk
IKernel
基本上是
IBindingRoot
+
IResolutionRoot
+
IDisposable
。因此a)您不需要
IBindingRoot
,为什么要让它可以访问?b) 您肯定不想处理注入的内核,否则最终会多次处理内核。但使用一次性物品而不进行处置并不是一种好的做法。c) 您不需要绑定
IResolutionRoot
,但您需要绑定
IKernel
(编辑:我对此不是100%确定)。您也可以使用
ICustomScope
来代替
ICustomScope
实现
INotifyWhenDisposed
,并处理范围。这样,您就不需要使用
iccustomscopefactory
来结束作用域。另外,代码分析(FxCop)可以帮助您确保正确处理IDisposable——这对于ICCustomScopeFactory.DisposeScope(…)。我认为这与普通的服务定位器没有什么不同。。因为你在注射容器本身。您的替代方法是注入
idependencysolver
或类似的东西。。使其独立于容器(如果这正是您的目标)。您可以使用
IResolutionRoot
接口,而不是
IKernel
接口。我想它已经注册了,所以你甚至不需要为它创建绑定。@BatteryBackupUnit使用
IResolutionRoot
而不是
IKernel
,有什么好处?@Kevin Kuszyk
IKernel
基本上是
IBindingRoot
+
IResolutionRoot
+
IDisposable
。因此a)您不需要
IBindingRoot
,为什么要让它可以访问?b) 您肯定不想处理注入的内核,否则最终会多次处理内核。但使用一次性物品而不进行处置并不是一种好的做法。c) 您不需要绑定
IResolutionRoot
,但您需要绑定
IKernel
(编辑:我对此不是100%确定)。您也可以使用
ICustomScope
来代替
ICustomScope
实现
INotifyWhenDisposed
,并处理范围。这样,您就不需要使用
iccustomscopefactory
来结束作用域。另外,代码分析(FxCop)可以帮助您确保正确处理IDisposable——这对于ICCustomScopeFactory来说不是这样。DisposeScope(…)。我检查了,并且IKernelIResolutionRoot都已注册。确切地说,在激活依赖于
IKernel
IResolutionRoot
的实例时,Ninject已经提供了它们。我检查了,并且
IKernel
IResolutionRoot
都已注册。确切地说,在激活依赖于
IKernel
IResolutionRoot
的实例时,Ninject已经提供了它们。