代码之家  ›  专栏  ›  技术社区  ›  Finglas

Ninject 2.0-绑定到多次使用同一接口的对象?

  •  6
  • Finglas  · 技术社区  · 16 年前

    考虑以下事项:

        public Something(IInterface concreteObjectOne, IInterface concreteObjectTwo) 
        {
            this.concreteObjectOne = concreteObjectOne;
            this.concreteObjectTwo = concreteObjectTwo;
        }
    

    我该如何使用Ninject设置这种类型的绑定?我试着用谷歌搜索这个词,但我不知道这叫什么,所以我不能,也不能在维基上找到任何关于这个的东西。

    :

    我认为这就是所谓的基于约定的约束,如前所述 here . 但是,本文档适用于1.0版和2.0版,没有 Only 方法。我希望这是实现没有属性-使用名称约定或类似的东西。

    2 回复  |  直到 16 年前
        1
  •  9
  •   user434917 user434917    16 年前

    例子:

    public class ObjectOneAttribute : Attribute
    {
    
    }  
    public class ObjectTwoAttribute : Attribute
    {
    
    }
    

    那么

    public Something([ObjectOneAttribute] IInterface concreteObjectOne, [ObjectTwoAttribute] IInterface concreteObjectTwo) 
        {
            this.concreteObjectOne = concreteObjectOne;
            this.concreteObjectTwo = concreteObjectTwo;
        }
    

    Bind<IInterface>().To<YourConcreteTypeOne>().WhereTargetHas<ObjectOneAttribute>();
    Bind<IInterface>().To<YourConcreteTypeTwo>().WhereTargetHas<ObjectTwoAttribute>();
    

    更新:
    使用“When”方法:

    Bind<IInterface>().To<YourConcreteTypeOne>().When(r => r.Target.Name == "concreteObjectOne");  
    Bind<IInterface>().To<YourConcreteTypeTwo>().When(r => r.Target.Name == "concreteObjectTwo")
    

    ;

        2
  •  5
  •   Community Mohan Dere    9 年前

    模糊的 因为它没有提供关于IInterface的哪种实现的指导—我意识到这只是真实API的一个模型,虽然真实API可能以适当命名的参数的形式为人类开发人员提供更多帮助,但是像DI容器这样的机器无法推断出正确的用法。

    Inject 属性。。。

    然而,考虑一些替代方案:

    第一种方法是将两个相似的接口实例封装在一个 参数对象

    public interface IParameterObject
    {
        IInterface ObjectOne { get; }
    
        IInterface ObjectTwo { get; }
    }
    

    public Something(IParameterObject po)
    {
        this.concreteObjectOne = po.ObjectOne;
        this.concreteObjectTwo = po.ObjectTwo;
    }
    

    这意味着您可以将IParameterObject的配置推送到 Composition Root .

    特殊情况 更一般的设计 任何数字

    public Something(IEnumerable<IInterface> objects)
    

    我个人更喜欢上面的任何建议,而不是任何使用特定Ninject特性的建议,因为它迫使我使API在总体上更显式,从而更具可读性和可维护性。