Ninject Binding - PullRequest
       9

Ninject Binding

2 голосов
/ 07 августа 2009

Как связать мой интерфейс с конкретным классом в другой сборке?

В моем решении есть следующие проекты:

Foo.Data
Foo.Domain

В Структурной карте я добавляю имена двух сборок в файл StructureMap.config, а затем с помощью атрибутов PluginFamily и Pluggable сопоставляю мои интерфейсы с моим конкретным классом ».

Как можно сделать то же самое с Ninject?

1 Ответ

6 голосов
/ 11 августа 2009

Я сделаю пару предположений здесь.

  1. В вашем проекте Foo.Domain есть интерфейс IBar, а в вашем проекте Foo.Data есть конкретный класс BarClass.
  2. Вы фактически ссылаетесь на проект Foo.Domain в своем проекте Foo.Data, потому что BarClass реализует IBar.

Самое простое, что нужно сделать с Ninject, - это создать новый класс в Foo.Data, производный от StandardModule Ninject:

internal class BarModule : StandardModule {
  public override void Load() {
    Bind<IBar>()
      .To<BarClass>();
  }
}

Затем этот класс устанавливает привязку запросов IBar к конкретному классу BarClass. Это ваш XML-эквивалент.

Следующим шагом является создание ядра Ninject (он же «контейнер») и предоставление ему этого модуля (т.е. этой конфигурации). От того, где вы это делаете, во многом зависит то, какое приложение вы создаете. В общих чертах, вы обычно настраиваете ядро ​​в логической точке входа или в разделе «запуска» вашего кода. Если бы это было консольное или настольное приложение Windows, это, вероятно, было бы одним из первых действий, которые выполняет функция main ().

Код будет выглядеть так:

var modules = new IModule[] {
                              new BarModule()
                            };

var kernel = new StandardKernel(modules);

В этот момент, когда вы делаете что-то вроде этого:

var barObj = kernel.Get<IBar>()

Переменная barObj ссылается на экземпляр BarClass.

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

...