我正在使用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
issue tracker上发布此内容,但我甚至不确定这是否是一个问题,或者我只是错误地使用它。
答案 0 :(得分:2)
不支持。
这就是子内核的工作原理(据我所知TM): 如果您要求子内核中的类型,它首先检查它自己的绑定,看它是否能满足它。如果可以,它将返回值(必要时构造实例和依赖项)。如果子内核没有满足请求的绑定,它将要求父内核解析它并返回父内核的结果。
IServiceProvider
IService
的绑定,它根据父内核知道的绑定构造它 - 父内核不知道子内核和子内核的绑定。它甚至不知道请求来自子内核。IServiceProvider
和IService
- 两者都从父内核解析。长话短说:如果您希望子内核解析IServiceProvider
,则需要将IServiceProvider
的绑定添加到子内核。