用ninject子内核重新绑定间接依赖



我正在使用Ninject和Ninject.Extensions.ChildKernel

我有以下接口IServiceIServiceProvider

我的IServiceProvider实现采用IService实例

public interface IServiceProvider
{
    IService Service { get; }
}
public class ServiceProvider : IServiceProvider
{
    public ServiceProvider(IService service)
    {
        this.Service = service;
    }
    public IService Service { get; private set; }
}

现在我做以下

var container = new StandardKernel();
container.Bind<IService>().To<Service>();
container.Bind<IServiceProvider>.To<ServiceProvider>();
// later in code
var child = new ChildKernel(container);
child.Bind<IService>().To<ChildService>();
var provider = child.Get<IServiceProvider>();
var serviceA = provider.Service;      // <-- Service
var serviceB = child.Get<IService>(); // <-- ChildService

正如您所看到的,child.Get<IService>()按预期工作并返回ChildService,但我也希望用子内核构建的IServiceProvider的每个实例都使用ChildService。Ninject.Extensions.ChildKernel 是否可能

请注意:我已经在Ninject.Extensions.ChildKernel问题跟踪器上发布了这篇文章,但我甚至不确定这是一个问题,还是我只是用错了。

不支持它。

这就是子内核的工作方式(据我所知,TM):如果你向子内核请求一个类型,它会首先检查自己的绑定,看看是否能满足它。如果可以,它会返回值(必要时构造实例和依赖项)。如果子内核没有满足请求的绑定,它将要求父内核解析它并返回父内核的结果。

  • 您的子内核没有IServiceProvider的绑定
  • 因此,请求被转发到父内核以进行解析
  • 父内核确实有IService的绑定,它基于父内核知道的绑定来构建它——父内核不知道子内核和子内核的绑定。它甚至不知道请求来自子内核
  • 子内核返回CCD_ 10和CCD_

长话短说:如果您希望子内核解析IServiceProvider,则需要将IServiceProvider的绑定添加到子内核。

最新更新