Прежде всего, я знаю о соответствующем сообщении 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
Я просто попытался с последними нестабильными рабочими и сохранением контекста расширений, а результат все тот же.
Вы пытались использовать [Factory interface] (https://github.com/ninject/Ninject.Extensions.Factory/wiki/Factory-interface) вместо [Func] (https://github.com/ninject /Ninject.Extensions.Factory/wiki/Func)? – kayess
Пока еще нет, я предпочитаю использовать делегатов, если нет другой логики, кроме этого. Я сейчас попробую. –
Заметка автора может указывать на то, что стоит попробовать. Цитата: _Even, если он не принимает никаких аргументов, я лично считаю, что интерфейсы фабрики - это более чистый способ управления фабриками; в то время как вам нужно написать немного больше кода, улучшенная читаемость по сравнению с Func стоит усилий. –
kayess