У вас, ребята, довольно неплохая беседа, но я подумал, что добавлю ответ, чтобы прояснить ситуацию на основе исходного вопроса.
Короткий ответ заключается в том, что Ninject по-прежнему будет гарантировать, что у вас есть один экземпляр объекта, если вы укажите .Using<SingletonBehavior>
в своем операторе связывания, независимо от механизма активации - т.е. вы не обойдете механизмы Ninject, обеспечивающие один экземпляр объекта создается при использовании вашего собственного провайдера с использованием синтаксиса .ToProvider
или, в этом случае, синтаксиса .ToMethod
.
Вы должны просто написать своему поставщику, чтобы он предоставил экземпляры объекта - никакая другая семантика не навязывается поставщику. Таким образом, все типичные сгущения, необходимые для создания одноэлементных экземпляров, как вы указали в примере выше, не требуются.
Как пример, ваш провайдер становится намного проще; хотя я добавил разрешение ISomething
и IOther
с использованием ядра Ninject к вашему исходному примеру:
class MyClassProvider : SimpleProvider<MyClass> {
protected override MyClass CreateInstance(IContext context) {
int timeout = ConfigurationManager.AppSettings.Get("timeout");
int delay = ConfiguraionManager.AppSettings.Get("delay ");
ISomething something = context.Kernel.Get<ISomething>();
IOther other = context.Kernel.Get<IOther>();
return new MyClass(something, other, timeout, delay );
}
}
Ваше обязательное утверждение в вашем модуле Ninject будет выглядеть так:
public class MyModule : StandardModule {
public override void Load() {
Bind<IMyClass>()
.ToProvider<MyClassProvider>()
.Using<SingletonBehavior>();
}
}
При использовании SingletonBehavior
Ninject по-прежнему предоставит вам только один экземпляр MyClass, даже если вы используете своего собственного провайдера.
Это довольно легко проверить. Вы можете добавить свойство DateTime к своему классу, установить его в конструкторе DateTime.Now
и проверить объекты, возвращенные множественными вызовами Get () - все они будут иметь одинаковое время, даже если вы создали класс в своем провайдере , Затем измените Using<SingletonBehavior>
на Using<TransientBehavior>
и наблюдайте разницу. Каждый раз вы будете получать новый, созданный вашим провайдером.
Надеюсь, что эта помощь - кстати, не уверен, что я тот Питер, о котором вы говорили, но если это так, я польщен!