2015-09-14 2 views
0

Я хочу иметь только один экземпляр foo в моем коде, но с этой конфигурацией каждый раз, когда он создает новый экземпляр, и я каждый раз проверяю его конструктор, и я не могу понять, почему.Как обеспечить InSingletonScope, используя только один экземпляр

public sealed class foo: Ifoo 
    { 
     public string Test { get; set; } 
     public foo() 
     { 
      this.Test = "test"; 
     } 
    } 

мой контейнер, как этот

public class DefaultNinjectModule : NinjectModule 
{ 
     public override void Load() 
    { 
     this.Bind<foo>().ToSelf().InSingletonScope(); 
    } 
} 
+0

Вы запрашиваете 'foo' или' Ifoo'? потому что ваша привязка только к 'foo' –

+0

с запросом foo всякий раз, где – bidva

+0

@bidva Кажется, что это немного. Нет никакой реальной выгоды для привязки к конкретному классу и возникновения накладных расходов на DI (в частности, накладных расходов Ninject), поскольку вы теряете способность кодировать контракт вместо конкретной реализации. –

ответ

0

Рассказывать Ninject Связывание класса в одноплодной объеме:

kernel.Bind<foo>().ToSelf().InSingletonScope(); 

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

В вашем случае запрашивается DefaultNinjectModule (this) & не ядро. Создание экземпляра стандартного ядра в вашем DefaultNinjectModule,

var kernel = new StandardKernel(); 
kernel.Bind<foo>().ToSelf().InSingletonScope(); 

проверить эту ссылку для эталонных & настройки: Object scopes

0

Вы должны связать свой интерфейс к классу:

public override void Load() 
{ 
    this.Bind<Ifoo>().To<foo>().InSingletonScope(); 
} 

Затем, когда вы хотите foo вы используете:

kernel.Get<Ifoo>(); 

Это даст вам ваш единственный экземпляр foo.

Примечание. Если у вас есть один экземпляр класса, полученный из IDisposable, вы должны удалить один экземпляр, Ninject не сделает это за вас. В вашей разгрузке выполните:

public override void Unload() 
{ 
    this.Kernel.Get<Ifoo>().Dispose(); 
    base.Unload(); 
} 
Смежные вопросы