Каково намерение модулей Ninject?

Я - полный новичок к ninject

Я разделял чужой код и нашел несколько экземпляров nInject модулей - классы, которые происходят из Ninject. Модули. Модуль, и имеет метод загрузки, который содержит большую часть их кода.

Эти классы называют путем вызова метода LoadModule экземпляра StandardKernel и передачи его экземпляр класса модуля.

Возможно, я пропускаю что-то очевидное здесь, но каково преимущество этого законченного просто создание простого класса и вызов его метода или возможно статического класса со статическим методом?

 

58
задан guo 5 October 2016 в 22:25
поделиться

2 ответа

Модули Ninject - это инструменты, используемые для регистрации различных типов в контейнере IoC. Преимущество заключается в том, что эти модули затем хранятся в своих собственных классах. Это позволяет помещать различные уровни/услуги в их собственные модули.

// some method early in your app's life cycle
public Kernel BuildKernel()
{
    var modules = new INinjectModule[] 
    {
        new LinqToSqlDataContextModule(), // just my L2S binding
        new WebModule(),
        new EventRegistrationModule()
    };
    return new StandardKernel(modules);
}

// in LinqToSqlDataContextModule.cs
public class LinqToSqlDataContextModule : NinjectModule
{
    public override void Load()
    {
        Bind<IRepository>().To<LinqToSqlRepository>();
    }
}

Наличие нескольких модулей позволяет разделить проблемы даже внутри контейнера IoC.

Остальные вопросы звучат так, как будто это больше касается IoC и DI в целом, а не только Ninject. Да, вы можете использовать статические объекты конфигурации, чтобы делать практически все, что делает контейнер IoC. Контейнеры IoC становятся действительно хорошими, когда у вас есть несколько иерархий зависимостей.

public interface IInterfaceA {}
public interface IInterfaceB {}
public interface IInterfaceC {}

public class ClassA : IInterfaceA {}

public class ClassB : IInterfaceB
{
    public ClassB(IInterfaceA a){}
}

public class ClassC : IInterfaceC
{
    public ClassC(IInterfaceB b){}
}

Построение ClassC - это боль на данном этапе, с множеством глубин интерфейсов. Намного проще просто попросить ядро для IInterfaceC.

var newc = ApplicationScope.Kernel.Get<IInterfaceC>();
61
ответ дан 7 November 2019 в 05:35
поделиться

, Возможно, я пропускаю что-то очевидное здесь, но каково преимущество этого просто создав простой класс и вызов его метода, или возможно a статический класс со статическим методом?

Да, можно просто звонить, набор Обязывают ().To () операторы устанавливать привязку, без модуля.

различие - это при помещении этих операторов в модуль затем:

  • IKernel. Загрузка (IEnumerable <блок>) может динамично открыть такие модули посредством отражения и загрузить их.
  • привязка логически группируется под именем; можно использовать это имя для разгрузки их снова с IKernel. Разгрузиться (представляют в виде строки)
,
9
ответ дан 7 November 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: