【问题标题】:Using Ninject IOC to replace a factory使用 Ninject IOC 替换工厂
【发布时间】:2010-01-20 04:43:16
【问题描述】:

我在解析器中有一个工厂方法。本质上,当我加载一个令牌时,我会查找该令牌的处理程序,或者直接转到默认处理程序。我已将其实现为switchDictionary<string,Type>,但这两种方法都要求我将映射存储在处理程序类之外的其他位置。

我们正在为 IOC 使用 Ninject,所以我意识到我也可以使用它来做到这一点

kernel.Get<ITokenHandler>(tokenName); 

但这并不能节省我存储处理程序可以在 2 个位置处理什么令牌的信息。有没有办法可以装饰处理程序以便自动映射?

【问题讨论】:

    标签: c# inversion-of-control ninject factory-pattern


    【解决方案1】:

    如果我正确地回答了您的问题,听起来您想要检索命名绑定。您没有提及您使用的是哪个版本的 Ninject,但根据您的代码 sn-p,我猜您使用的是 Ninject 2.0。如果是这种情况,那么我认为这足以满足您在模块中的绑定:

    Bind<ITokenHandler>().To<YourConcreteTypeHere>().Named(tokenName);
    

    您将尽可能多的具体类型绑定到同一个接口并按名称区分它们,然后使用您在问题中指定的精确语法检索它们。

    如果我遗漏了什么关键,请告诉我。

    【讨论】:

    • 回到这里有点晚了。我真正追求的是一种标记 ITokenHandler 具体类的方法,以便我可以定义声明 Handler 的绑定。我现在已经与您的示例一起使用了所有 bar 1 的绑定都是模式: Bind().To>().Named(tokenName);
    【解决方案2】:

    我使用的一种技术是 Bind 的东西,在这样一种方式下,您可以要求在您希望某人选择某些内容时(在上下文中)提交一个参数。

    http://ninject.codeplex.com/wikipage?title=Providers%20and%20the%20Activation%20Contexthttp://ninject.codeplex.com/wikipage?title=Contextual%20Binding 之间,您应该能够以一种可以说Only(When.Context...) 的方式绑定事物以进行选择?

    【讨论】:

    • 只看到了另一个答案(就像对此 +1 一样)。另一个答案看起来是一种更加明确和清晰的方法,所以如果可能的话,我肯定会更喜欢它 - 我的方法是一种更通用的方法,用于以不可能的方式构建。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多