2010-05-19 3 views
1

Я хочу разделить контейнер на разных уровнях в моем приложении. Я начал создавать статический класс, который инициализирует контейнер и типы регистров в контейнере.Ninject: Shared DI/IoC container

public class GeneralDIModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IDataBroker>().To<DataBroker>().InSingletonScope(); 
    } 
} 

public abstract class IoC 
{ 
    private static IKernel _container; 

    public static void Initialize() 
    { 
     _container = new StandardKernel(new GeneralDIModule(), new ViewModelDIModule()); 
    } 

    public static T Get<T>() 
    { 
     return _container.Get<T>(); 
    } 
} 

Я заметил, что есть метод Resolve. В чем разница между Resolve и Get?

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

Есть метод Inject, но он говорит, что жизненный цикл экземпляра не управляется?

Может ли кто-нибудь, пожалуйста, установить меня правильно?

Как я могу зарегистрировать, отменить регистрацию объектов и сбросить контейнер.

+0

Hi Ian Спасибо за ответ. Несколько вопросов - Способ Get создает новый экземпляр типа с переходным стилем жизни? - Если я создаю издевательский экземпляр типа с использованием какой-то насмешливой структуры, скажем, Rhino Mocks и внедрить ее в ядро, тогда последующий Get создаст новый экземпляр этого типа или вернет тот же экземпляр? - Является ли ninject.moq чем-то другим, чем RhinoMocks? Спасибо – joblot

+0

Если вы не указали стиль жизни или укажите .InTransientScope(), каждый вызов .Get вернет новый экземпляр. Если вы можете, используйте Moq или RhinoMocks перед Ninject.Moq (который использует Moq). Moq и RhinoMocks - оба изящные рамки. –

+0

, поэтому, если я укажу SingletonScope при привязке в модуле и вставляю вымышленный экземпляр типа, каждый вызов Get вернет тот же экземпляр? Что это означает, когда сказано, что Inject вводит указанный существующий экземпляр без управления его жизненным циклом? Я также реализовал в версии Silverlight версии Ninject нет версии Load, которая принимает струнную награду, которую можно использовать для динамической загрузки модулей Load ("*. Dll"). Как добиться динамической загрузки в Silverlight. Спасибо – joblot

ответ

2

Ninject по умолчанию связывает компоненты в переходном стиле жизни, а Ninject не отслеживает временные экземпляры. Резолюция используется внутренне и не должна использоваться вашим кодом, если вы действительно не знаете, что делаете. Если вы хотите издеваться над своим контейнером, используйте расширение ninject.moq на github. Метод инъекции, к которому вы обращаетесь, относится к тем экземплярам, ​​которые вы создали сами. Используйте методы Get и TryGet.

+0

В Ninject 2 образ жизни по умолчанию - одноэлементный, а не временный. –

+0

Мы изменили его более года назад на переходный период. Вы можете увидеть это в вине для строки 104: http://github.com/ninject/ninject/blame/master/src/Ninject/Planning/Bindings/Binding.cs –

+0

Hi Ian Спасибо за ответ. Несколько вопросов - Способ Get создает новый экземпляр типа с переходным стилем жизни? - Если я создаю издевательский экземпляр типа с использованием какой-то насмешливой структуры, скажем, Rhino Mocks и внедрить ее в ядро, тогда последующий Get создаст новый экземпляр этого типа или вернет тот же экземпляр? - Является ли ninject.moq чем-то другим, чем RhinoMocks? Спасибо – joblot