Lazy имеет несколько конструкторов, с помощью которых вы можете управлять поведением потоков экземпляра Lazy. Какой конструктор используется Ninject для создания внедренного экземпляра Lazy? Как я могу указать, какой конструктор должен использовать Ninject? если это возможно.
Как называется конструктор Lazy‹T›, когда Ninject внедряет объекты Lazy‹T›?
Ответы (1)
Короткий рассказ
По умолчанию LazyThreadSafetyMode.ExecutionAndPublication
Измените его одним из следующих способов:
// for all Lazy's
Bind<LazyThreadSafetyMode>().ToConstant(LazyThreadSafetyModeNone);
// for a specific Lazy<FooBar>
Bind<LazyThreadSafetyMode>().ToConstant(LazyThreadSafetyModeNone)
.WhenInjectedInto(typeof(Lazy<FooBar));
Или же вы можете использовать привязку Bind(typeof(Lazy<>))
или Bind<Lazy<FooBar>>()
в сочетании с
Длинная история
Lazy<T>
поддержка неявно обеспечивается Ninject.Extensions.Factory.
По умолчанию ninject будет разрешать запросы для типов, которые могут быть созданы напрямую (не интерфейсные, не абстрактные) путем создания экземпляра этого типа. Это также относится к Lazy
. Затем он будет искать конструктор с наибольшим количеством аргументов, которые он может предоставить, и использовать его (см. здесь и здесь) Ninject.Extensions.Factory предоставляет привязки для Func
s (см. здесь]. Но он не предоставляет привязку для LazyThreadSafetyMode
. Таким образом, Ninject выберет конструктор Lazy(Func<T>)
. Этот конструктор использует LazyThreadSafetyMode.ExecutionAndPublication
(см. примечания здесь).