Ninject:将客户端的程序集作为构造函数参数传递,并使用属性从客户端指定所需的实现

本文关键字:客户端 属性 实现 程序集 Ninject 参数传递 构造函数 | 更新日期: 2023-09-27 18:34:41

我是Ninject和Dependency Injection的新手,所以请原谅我的菜鸟。 =)

我有几个 IConfig 接口的实现,它扫描程序集及其依赖项以实现IConfigOption接口的类型。每个IConfig实现都从不同的源检索其值。

这些

实现将根程序集从哪里开始扫描作为构造函数参数,我正在尝试提出一个注入这些值的绑定。到目前为止,我正在考虑以下几行:

Bind<IConfig>().To<Config>().WithConstructorArgument("rootAssembly", target);

我的问题是,我似乎找不到一种方法来获取对将注入Config类的target程序集的引用。如果没有 DI,我会使用 Assembly.GetCallingAssembly() ,但在这种情况下,这将产生绑定所在的程序集,而不是所需的目标程序集。

此外,我需要一种方法来指定将接收注入的类/成员的预期实现,例如,客户端类 A 请求使用 RoleEnvironmentConfig实现器,客户端类 B 请求使用 ConfigurationManagerConfig实现器。下面是一个阐明预期用法的示例:

public class Client
{
    [UseApplicationConfig]
    public IHelper WithAppConfig { get; set; }
    [UseRoleEnvironmentConfig]
    public IHelper WithRoleEnvironmentConfig { get; set; }
}
public class Helper : IHelper
{
    public Helper(IConfig config)
    {
    }
}

有一种感觉,要么我从错误的角度看这个问题,要么我错过了显而易见的东西,但我不确定我应该寻找什么。最好的方法是什么?

谢谢。

编辑:添加了预期用法的示例,并重新措辞了问题的某些部分以使其清晰。

Ninject:将客户端的程序集作为构造函数参数传递,并使用属性从客户端指定所需的实现

如果要

获取有关对对象发出的请求的详细信息,请使用重载WithConstructorArgument(string, Func<IContext, object>)。您可以使用提供的IContext查找程序集名称(使用调试器环顾四周,听起来您的布局可能非常复杂,所以我无法提供特定的代码(。

作为如何使用它的示例:

//get the full name of the requested object
Bind<IFoo>()
    .To<Foo>()
    .WithConstructorArgument("bar",
                             c => c.Request.FullName);

然而,在我看来,你从错误的角度看待它。如果我没看错你的问题,听起来你有一个类来扫描你的程序集,然后决定注入什么,而不是让 Ninject 为你做。我认为这是您不使用 DI 时的遗留物?

我将了解如何将上下文绑定与 WhenInjectedInto 方法或自定义属性结合使用,以将所需的特定IHelper注入构造函数。看这里: https://github.com/ninject/ninject/wiki/Contextual-Binding

链接的页面实际上有一个做类似事情的示例,可能对你有用:

Bind<IWarrior>()
    .To<Samurai>()
    .When(request => request.Target.Type.Namespace.StartsWith("Samurais.Climbing"));

不过,我可能仍然会使用WhenInjectedInto或属性,因此您没有任何"魔术字符串",以防以后重构命名空间。