【问题标题】:Binding ninject via name通过名称绑定ninject
【发布时间】:2015-01-29 10:26:21
【问题描述】:

我有一个 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 无法解决依赖关系。那时我不能使它成为一个命名依赖项,因为两个处理器都使用这些类。

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

编辑 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);
    }

【问题讨论】:

  • 我觉得不错。但是你为什么不使用/扩展WhenAnyAncestorMatches 方法呢?
  • 无法解析方法?!
  • 奇怪。不过它应该在那里,例如它用于 ninject 的测试here
  • 我知道,很奇怪。感谢您的帮助。

标签: c# ninject


【解决方案1】:

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

另外,还有WhenInjectedInto&lt;&gt; 绑定,它可以像这样使用:

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

现在,由于您实际上并不想将其直接注入ProcessA,因此您必须使用When 条件,例如WhenInjectedIntoAncestor&lt;Process&gt;()。您可以自己创建它 - 作为从 WhenAnyAncestorMatches 扩展方法扩展而来的扩展方法。另见here

【讨论】:

  • 感谢您的回答,认为它让我走上了正确的道路。你能检查我的编辑吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多