用ninject childkernel重新绑定间接depdendency

时间:2015-11-27 07:21:32

标签: c# .net dependency-injection ninject ninject-extensions

我正在使用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 issue tracker上发布此内容,但我甚至不确定这是否是一个问题,或者我只是错误地使用它。

1 个答案:

答案 0 :(得分:2)

不支持。

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

  • 您的子内核没有IServiceProvider
  • 的约束力
  • 请求因此被转发到父内核以进行解析
  • 父内核确实有IService的绑定,它根据父内核知道的绑定构造它 - 父内核不知道子内核和子内核的绑定。它甚至不知道请求来自子内核。
  • 子内核返回IServiceProviderIService - 两者都从父内核解析。

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