2014-11-10 5 views
1

Если у меня есть реализация класса Human и Dog, который использует интерфейс IPerson и классы HumanFood и DogFood, используя интерфейс IFood. Как я могу перейти от использования HumanFood к DogFood и Human to Dog в моей основной функции?Ninject - несколько классов с использованием единого интерфейса (доступно несколько совпадающих привязок)

В настоящее время, как это написано, это дает мне возможность «иметь более одного соответствия».

Спасибо!

public class Bindings : NinjectModule 
{ 
    public override void Load() 
    { 
     this.Bind<IFood>().To<HumanFood>(); 
     this.Bind<IFood>().To<DogFood>(); 
     this.Bind<IPerson>().To<Human>(); 
     this.Bind<IPerson>().To<Dog>(); 
    } 
} 

static void Main(string[] args) 
{ 
    IKernel kernel = new StandardKernel(); 
    kernel.Load(Assembly.GetExecutingAssembly()); 

    IFood food = kernel.Get<IFood>(); 
    IPerson person = kernel.Get<IPerson>(); 
    person.BuyFood(); 

    Console.ReadLine(); 
} 

ответ

3

Типичные способы сделать это либо использовать поименованые:

this.Bind<IFood>().To<HumanFood>().Named("HumanFood"); 

Или для определения связывания для использования на основе WhenInjectedInto:

this.Bind<IFood>().To<HumanFood>().WhenInjectedInto<Human>(); 
this.Bind<IFood>().To<DogFood>().WhenInjectedInto<Dog>(); 

Однако оба они представляют собой a код запах. Возможно, вам захочется переосмыслить, почему вы вводите различные реализации в зависимости от назначения и, возможно, вместо этого вводите реализацию заводского шаблона.

Удобный обзор некоторых из вещей вы можете сделать, можно найти здесь:

http://lukewickstead.wordpress.com/2013/02/09/howto-ninject-part-2-advanced-features/