我正在使用Ninject和Ninject.Extensions.ChildKernel
我有以下接口IService
和IServiceProvider
我的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
的绑定添加到子内核。