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

时间:2012-05-20 22:08:13

标签: c# binding dependency-injection ninject constructor-injection

我对Ninject和Dependency Injection很新,所以请原谅我的noobness。 =)

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

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

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

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

另外,我需要一种从接收注入的类/成员中指定预期实现的方法,以便例如客户端类A要求Config实现者使用RoleEnvironment和客户端类B要求使用Config的{​​{1}}实施者。以下是澄清预期用途的示例:

ConfigurationManager

我感觉我要么从错误的角度看这个,要么我错过了明显的,但我不确定我应该寻找什么。如何才能做到最好?

非常感谢。

编辑:添加了一个预期用法的示例,并为了清楚起见重新描述了问题的某些部分。

1 个答案:

答案 0 :(得分:1)

如果要获取有关正在对该对象发出的请求的详细信息,请使用重载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或属性,所以如果您稍后重构名称空间,则不会有任何“魔术字符串”。