2015-01-28 4 views
1

Допустим, у нас есть класс X, как это:Инъекция нескольких параметров одного и того же типа в Ninject

class X 
{ 
    X(Z a, Z b) 
    { } 
} 

А класс Z будет иметь Y зависимость:

class Z 
{ 
    Z(Y c) 
    { } 
} 

Что собственно способ связать эти классы таким образом, чтобы два экземпляра Z, каждый из которых с другим экземпляром Y, вводились в X?

Я знаю, что они связаны с привязкой к контексту, но я не уверен, как это сделать.

EDIT:

Y-класс будет:

class Y 
{ 
    Y(string someString) 
    { } 
} 

Я хочу, чтобы два экземпляра Y с другой строкой, а также.

Благодаря

+0

Прошу прощения тем, кто ответил, я только что отредактировал его, но в основном пример такой же. – Jassel

+0

То, что вы пытаетесь достичь, не поддерживается каким-либо особым способом с помощью ninject. Вы можете использовать привязку «ToMethod» или «IProvider», чтобы поместить логику создания 'X' с ее конкретным' Z''ем там. – BatteryBackupUnit

ответ

0

Вы могли бы использовали Named Bindings. Другие типы контекстных привязок можно найти here.

Bind<X>().To<XA>().Named("A"); 
Bind<X>().To<XB>().Named("B"); 

public class Z { 
    public Z([Named("A")] X x1, [Named("B")] X x2) {} 
} 
+0

Вы положили его вверх ногами, но, как бы то ни было, мой вопрос заключается в том, как вы укажете два экземпляра X, которые будут вставляться также в разные экземпляры Y – Jassel

+0

. И желательно без необходимости поместить атрибут Named в конструктор Z, если возможно – Jassel

0

Если привязки для X и Y не с заданной областью, то каждый раз, когда объект X запрашивается из ядра, он будет получать построен с двумя уникальными объектами Z (каждый из которых имеет уникальный экземпляр Y). Это произойдет по умолчанию.

+0

Да, вы Верно! но что, если я хочу, чтобы два экземпляра Y возвращали другую строку? – Jassel

+0

Будет ли аргумент конструктора a (класс Z) всегда получать одну и ту же строку? Будет ли аргумент конструктора b (класс Z) всегда получать одну и ту же строку? – Starfiredust

+0

да, они всегда получат одну строку – Jassel

0

передать свои зависимости, которые реализуют тот же интерфейс, что и IEnumerable. В противном случае Ninject будет кричать на вас, если у вас есть несколько привязок для одного интерфейса. Используйте метод .WithConstructorArgument(), чтобы определить вашу строку. Если строка не является константой, вы можете использовать .ToMethod() и определить строку во время выполнения.

public class Z 
{ 
    public Z(IEnumerable<Y> dependencies) 
    { 
     if (dependencies == null) throw new ArgumentNullException("dependencies"); 
     _dependencies = dependencies; 
    } 
} 

static void Main() // or other entry point 
{ 
    var kernel = new StandardKernel(); 
    kernel.Bind<Z>().To<ZImplementation>(); 
    kernel.Bind<Y>().To<YImplementation1>().WithConstructorArgument("c", "string to inject 1"); 
    kernel.Bind<Y>().To<YImplementation2>().WithConstructorArgument("c", "string to inject 2"); 
} 
Смежные вопросы