Как называется конструктор Lazy‹T›, когда Ninject внедряет объекты Lazy‹T›?

Lazy имеет несколько конструкторов, с помощью которых вы можете управлять поведением потоков экземпляра Lazy. Какой конструктор используется Ninject для создания внедренного экземпляра Lazy? Как я могу указать, какой конструктор должен использовать Ninject? если это возможно.


person Community    schedule 13.02.2015    source источник


Ответы (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 предоставляет привязки для Funcs (см. здесь]. Но он не предоставляет привязку для LazyThreadSafetyMode. Таким образом, Ninject выберет конструктор Lazy(Func<T>). Этот конструктор использует LazyThreadSafetyMode.ExecutionAndPublication (см. примечания здесь).

person BatteryBackupUnit    schedule 13.02.2015