Как запустить прилагаемую демоверсию IOC (Inversion Of Control) из документации Castle Windsor? - PullRequest
0 голосов
/ 07 января 2012

В IOC Castle Windsor wiki [Примечание редактора: после того, как этот вопрос был написан, вики был дополнен дополнительным примером кода], имеется следующий (неполный) демонстрационный код.

Как мне завершить этот код, чтобы он правильно работал в консольном приложении C #?

//application starts...
var container = new WindsorContainer();

// adds and configures all components using WindsorInstallers from executing assembly
container.Install(FromAssembly.This());

// instantiate and configure root component and all its dependencies and their dependencies and...
var king = container.Resolve<IKing>();
king.RuleTheCastle();

// clean up, application exits
container.Dispose();

Обновление:

Обнаружено обучающие видеоролики по IOC вобщие сведения .

До добавления интерфейса и конкретной реализации интерфейса:

interface IKing
{
    void RuleTheCastle();   
}

public class King
{
    void RuleTheCastle()
    {
        Consolel.Write("Rule the castle.");
    }
}

Однако при запуске я выдал ошибку времени выполнения.

Обновление:

В итоге я использовал Ninject , потому что:

  1. Документация намного превосходит Castle Windsor (иSpring.NET в этом отношении).
  2. Используется компиляция выражений / LCG , поэтому он быстрее (от 8x до 50x) по сравнению с Castle Windsor, который использует Reflection.

Чтобы начать, нажмите «Посетить додзё», а затем выполните серию учебников по NInject.на GitHub .

После того, как вы это сделаете, вы можете просмотреть учебное видео на TekPub .Видео проходит концепции довольно быстро, поэтому было бы неплохо сначала завершить серию руководств по NInject для GitHub .

1 Ответ

2 голосов
/ 08 января 2012

Как правило, чтобы применить IoC в консольном приложении C #, вы должны использовать точку входа (например, метод Main) для:

  • создания и настройки контейнера IoC - первые две строки в примере кода
  • используют контейнер для построения графа объекта (объекта и его зависимостей) - 3-я строка кода
  • passуправление разрешенным объектом, обычно путем вызова метода для него - 4-я строка кода
  • после того, как приложение выполнено, скажите контейнеру выполнить любую очистку, которую он должен выполнить - 5-я строка кода

Это то, что демонстрирует этот код, и с этой точки зрения оно завершено.

Однако, для того, чтобы это приложение работало, естьдве другие очень важные предпосылки:

  • приложение должно быть разработано с учетом принципа инверсии контроля (это на самом деле сложная часть)
  • сборка точки входаконсолиприложение должно содержать Windsor Installers , которые используются для настройки контейнера и которые в основном определяют, какие конкретные типы будут использоваться всякий раз, когда необходим интерфейс.

Код для класса Installerв этом примере будет выглядеть так:

public class KingApplicationInstaller : IWindsorInstaller
{
   public void Install(IWindsorContainer container, IConfigurationStore store)
   {
        container.Register(
            Component.For<IKing>().ImplementedBy<King>());
   }
}
...