3

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

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

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

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

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

另外,我需要一种从将接收注入的类/成员中指定预期实现的方法,例如,客户端类 A 请求使用的Config实现者,RoleEnvironment客户端类 B 请求使用的Config实现者ConfigurationManager。这是一个说明预期用途的示例:

public class Client
{
    [UseApplicationConfig]
    public IHelper WithAppConfig { get; set; }

    [UseRoleEnvironmentConfig]
    public IHelper WithRoleEnvironmentConfig { get; set; }
}

public class Helper : IHelper
{
    public Helper(IConfig config)
    {
    }
}

我觉得要么我从错误的角度看这个,要么我错过了明显的东西,但我不确定我应该寻找什么。最好的方法是如何做到这一点?

非常感谢。

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

4

1 回答 1

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"));

我可能仍会使用WhenInjectedIntoor 属性,因此您没有任何“魔术字符串”,以防您稍后重构命名空间。

于 2012-07-04T19:15:23.030 回答