Есть ли у Ninject эквивалент TypedParameter или ResolvedParameter от Autofac? - PullRequest
1 голос
/ 24 января 2011

В Autofac можно указать TypedParameter при регистрации службы, давая конкретное значение или делегат, который будет передан в конструктор службы. Фактический параметр в конструкторе будет обнаружен по типу во время разрешения / создания экземпляра.

В Ninject я могу найти поддержку только для именованных параметров (то есть, заранее зная реальное имя параметра .ctor). В противном случае Ninject обнаружит неопределенные параметры конструктора и попытается разрешить любые типы, необходимые с помощью контейнера.

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

Я хочу дать Ninject конкретный фабричный делегат или значение для параметра конструктора, задав в качестве квалификатора только тип, а не имя параметра. Я также не хочу иметь зависимость от Ninject, украсив параметр конструктора какими-либо атрибутами.

Возможно ли это? Большое спасибо заранее!

Ответы [ 2 ]

6 голосов
/ 24 января 2011

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

Bind<IFoo>().To<Foo>().When(request => SomeFancyFilter(); }

Я не знаю, что подходит вам лучше всего, потому что вы не указываете, чего действительно хотите достичь Но я думаю, что один из следующих должен применяться:

Bind<IFoo>().To<Foo1>().WhenInjectedInto<Class1>()
Bind<IFoo>().To<Foo2>().WhenInjectedInto<Class2>()

Или: Создайте свои собственные атрибуты, например Bar1, Bar2 и добавьте их в свои конструкторы:

public Class1([Bar1]IFoo foo)
public Class2([Bar2]IFoo foo)
public Class3([Bar2]IFoo foo)

Bind<IFoo>().To<Foo1>().WhenTargetHas<Bar1Attribute>()
Bind<IFoo>().To<Foo2>().WhenTargetHas<Bar2Attribute>()
0 голосов
/ 24 января 2011

Я не понимаю ваш вопрос на 100%.Можете ли вы привести пример того, что вы пытаетесь сделать?Похоже, что это может удовлетворить ваши потребности:

https://github.com/ninject/ninject/wiki/Multi-injection

Если нет, я чувствую, что вам нужно будет сделать фабричный метод, как этот пример:

    public override void Load()
    {
        Func<Ninject.Activation.IContext, IMyInterface> factoryFunc = 
            (context) => {
                return new ConcreteFactory(...parameters...); 
            };

        Bind<IMyInterface>().ToMethod(factoryFunc);
    }

В методе вашего factoryFunc вы, возможно, можете проверить контекст (который является связующим контекстом), чтобы вернуть желаемый фабричный метод.В частности, вы можете проверить context.Request.Service или context.Request.Target.

Опять же, мне нужно будет увидеть пример того, что вы делаете, чтобы действительно ответить на ваш вопрос.

...