2009-08-07 2 views
2

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

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

Foo.Data
Foo.Domain

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

Как выполнить одно и то же с Ninject?

+0

Имеются ли в проектах в решении как интерфейсы, так и конкретные классы? Вы хотите привязать их к потребляющему решению/проекту или самому решению? –

+0

Кроме того, какую версию Ninject вы используете? –

+0

@Peter Интерфейс находится в моем домене и конкретных классах в слое данных. Я просто ищу, чтобы связать внутри решения. Я также рассматриваю вместо того, чтобы выделять домен и слой данных по проекту, чтобы сделать это в отдельных папках в рамках одного и того же проекта. Я использую Ninject 1.0 для компактной структуры. –

ответ

6

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

  1. У вас есть интерфейс IBar в вашем проекте Foo.Domain, и у вас есть конкретный класс BarClass в вашем проекте Foo.Data.
  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 (aka «container») и предоставление ему этого модуля (то есть этой конфигурации). Там, где вы это делаете, во многом зависит от того, какое приложение вы создаете. В общих чертах вы, как правило, настраиваете ядро ​​в точке логической точки входа или «запуска» вашего кода. Если это консольное приложение или настольное приложение Windows, это, вероятно, будет одной из первых вещей, которые выполняет функция main().

Код хотел бы это:

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

var kernel = new StandardKernel(modules); 

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

var barObj = kernel.Get<IBar>() 

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

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

+0

Немного опоздал на вечеринку, но это очень солидный ответ, спасибо Питер. –

Смежные вопросы