通过名称绑定ninject

时间:2015-01-29 10:26:22

标签: c# ninject

我有一个ninject问题,我在多种类型上使用相同的接口为我的应用程序提供配置类。

启动该应用程序的入口点类(如下)是从ninject内核返回的,我对该类有一个名为Config的依赖项。

    public ProcessA(ILogger logger, [Named("TypeA")] IConfigProvider configProvider)
    {
        _logger = logger;
        _configProvider = configProvider;
    }

    public ProcessB(ILogger logger, [Named("TypeB")] IConfigProvider configProvider)
    {
        _logger = logger;
        _configProvider = configProvider;
    }

然后在我的绑定中

        Bind<IConfigProvider>().To<ProcessA>().Named("TypeA");
        Bind<IConfigProvider>().To<ProcessB>().Named("TypeB");

继续沿着处理线ProcessAProcessB分享一些需要IConfigProvider的类,但当ProcessAProcessB到达那个点时,ninject不能解决依赖问题。我不能在那时使它成为命名依赖项,因为两个处理器都使用这些类。

我可以从ConfigProcessA向下传递具体的ProcessB类,删除构造函数依赖项,但这似乎不是正确的方法。

编辑1(来自BatteryBackupUnit的回答)

我删除了指定的引用并添加了下面似乎可以解决的问题。找到了关于以下问题Ninject Bind When Ancestor Of Type T的方法,但我必须添加request.Target == null的检查,否则当我从ninject获得ProcessAProcessB的实例时,它将无法工作内核。

    public override void Load()
    {
        Bind<IConfigProvider>()
            .To<TypeAConfigProvider>()
            .When(request => HasAncestorOfType<ProcessA>(request));

        Bind<IConfigProvider>()
            .To<TypeBConfigProvider>()
            .When(request => HasAncestorOfType<ProcessB>(request));
    }

    private static bool HasAncestorOfType<T>(IRequest request)
    {
        if (request == null || request.Target == null) 
            return false;

        if (request.Target.Member.ReflectedType == typeof(T)) 
            return true;

        return HasAncestorOfType<T>(request.ParentRequest);
    }

1 个答案:

答案 0 :(得分:1)

您可以使用contextual binding机制来实现这一目标。 有关所有可用方法,请参阅IBindingWhenSyntax.csWhenAnyAncestorNamed怎么样?

或者,可以使用WhenInjectedInto<>绑定,如:

Bind<IConfigProvider>().To<ConfigA>()
    .WhenInjectedInto<ProcessA>();

现在,由于您实际上并不想将其直接注入ProcessA,因此您必须使用When这样的WhenInjectedIntoAncestor<Process>()条件。您可以自己创建 - 作为从WhenAnyAncestorMatches扩展方法扩展的扩展方法。另请参阅here