2016-02-12 5 views
3

Прежде всего, я знаю о соответствующем сообщении here, но этот пост довольно стар, и что более важно, не ответил прямо.Ninject Factory + InCallScope + ContextPreservation

Итак, теперь я использую последние Ninject (стабильные, 3.2 Nuget-пакеты) и вышеупомянутые расширения и по-прежнему вижу непредвиденное поведение.

public interface IFoo {} 
public class Foo {} 

public class Parent { 
    public IFoo foo; 
    public IFoo foo2; 
    public Func<IFoo> fooFactory; 
    public Parent(IFoo foo, Func<IFoo> factory) { 
    this.foo = foo; 
    this.fooFactory = factory; 
    } 
    public void init() { this.foo2 = this.fooFactory(); } 
} 

... 

kernel.Bind<IFoo>().To<Foo>().InCallScope(); 
var instance = kernel.Get<Parent>(); 
instance.init(); 
instance.foo.ShouldEqual(instance.foo2); 

Этот тест не удается, так что кажется, что контекст не сохраняется для функции заводской, и он создает новый Foo.

Как достичь ожидаемого поведения?

UPDATE

Основываясь на комментарий я пробовал один и тот же код с объявленной IFooFactory интерфейса, связанного с ToFactory(). Поведение одно и то же.

UPDATE 2

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

+0

Вы пытались использовать [Factory interface] (https://github.com/ninject/Ninject.Extensions.Factory/wiki/Factory-interface) вместо [Func] (https://github.com/ninject /Ninject.Extensions.Factory/wiki/Func)? – kayess

+0

Пока еще нет, я предпочитаю использовать делегатов, если нет другой логики, кроме этого. Я сейчас попробую. –

+0

Заметка автора может указывать на то, что стоит попробовать. Цитата: _Even, если он не принимает никаких аргументов, я лично считаю, что интерфейсы фабрики - это более чистый способ управления фабриками; в то время как вам нужно написать немного больше кода, улучшенная читаемость по сравнению с Func стоит усилий. – kayess

ответ

0

Существует 2 вызова. Один - kernel.Get<Parent>(), другой - instance.init().

 Смежные вопросы

  • Нет связанных вопросов^_^