Примеры контейнеров МОК [закрываются]

Вы ничего не видите на терминале из-за опечатки в выводе printf("main/n");

printf не сбрасывается в stdout и созданные потоки потребляют цикл навсегда, или, по крайней мере, в течение длительного времени.

Вы должны добавить fflush(stdout); после оператора printf, чтобы проверить это.

Затем вы можете попробовать printf("main\n"); без fflush() проверить, что stdout буферизована строкой, то есть: вывод сбрасывается на терминал, когда выводится новая строка.

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

Обратите внимание, что для большинства пользователей код будет легче читать, если вы используете английские слова для идентификаторов, типов, комментариев и сообщений.

44
задан Morph 20 April 2009 в 20:51
поделиться

9 ответов

Я немного использовал StructureMap . Остальная часть вашего вопроса довольно загружена. Я попытаюсь объяснить концепцию на примере.

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

Вместо этого вы должны создать и закодировать интерфейс, подобный этому:

interface IPaymentProcessor
{
    bool ProcessPayment(amount, ....);
}

Весь ваш код PayPal будет находиться в классе, реализующем методы вашего интерфейса - например, PayPalPaymentProcessor .

Теперь у вас есть объект, который вы будете использовать для обработки платежей. Это может быть контроллер (ASP.NET-MVC, ViewModel-WPF) или просто класс, как показано здесь:

class PaymentProcessor
{
    private IPaymentProcessor _processor = null;
    public PaymentProcessor(IPaymentProcessor processor)
    {
        _processor = processor;
    }

    public bool ProcessTransaction(Transaction trans)
    {
       _processor.ProcessPayment(trans.amount, ...);
    }
}

Здесь появляется контейнер IoC. Вместо того, чтобы вызывать конструктор вручную, вы позволите контейнеру IoC ввести зависимость:

PaymentProcessor processor = ObjectFactory.GetInstance<PaymentProcessor>();

Этот фрагмент кода сообщает StructureMap: «Каждый раз, когда вы видите конструктор, которому требуется IPaymentProcessor , возвращайте новый PayPalPaymentProcessor ».

ObjectFactory.Initialize(x =>
{ 
    x.ForRequestedType<IPaymentProcessor>().TheDefaultIsConcreteType<PayPalPaymentProcessor>();
});

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

Надеюсь, это поможет!

57
ответ дан 26 November 2019 в 21:57
поделиться

Проверьте Spring IoC (.net) a java / .net контейнер. Документация довольно хорошее введение.

Вкратце: Вы можете думать об IoC как о архитектуре, которая поощряет: составление объектов и программирование на интерфейс .

Это дает вам следующее:

  • возможность легкого модульного тестирования вашего кода (вы можете легко тестировать ваши объекты изолированно, копируя все его зависимости).

  • Очень продвинутая конфигурация (потому что ваша программа с IoC это просто набор объектов и конфигурация, которая склеивает объекты вместе.

  • Возможность расширять или модифицировать байтово скомпилированное приложение (это верно для Java, я не уверен, верно ли это для .net).

3
ответ дан 26 November 2019 в 21:57
поделиться

Мы используем Ninject из-за его простого API и быстрого разрешения объектов. Он очень хорошо документирован и использует функции C # 3.0, такие как лямбда-выражения, для упрощения спецификации.

Вы можете найти несколько скринкастов по Ninject здесь

2
ответ дан 26 November 2019 в 21:57
поделиться

Вы пытаетесь создать контейнер IoC, почему бы не использовать один из доступных, таких как Spring.NET, StructureMap или Unity Блок приложения? Здесь список проектов IoC с открытым исходным кодом

1
ответ дан 26 November 2019 в 21:57
поделиться

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

Возможно, вы захотите взглянуть на этот ответ , где я говорю об основном использовании контейнера IoC (я всегда думаю, что вещи проще понять на простом примере) - это может помочь вам понять вещи немного больше. По сути, контейнер IoC помогает вам создавать объекты со всеми удовлетворенными зависимостями и позволяет изменять ваши зависимости с минимальным кодом конфигурации.

1
ответ дан 26 November 2019 в 21:57
поделиться

Попробуйте прочитать Введение в блок приложений Unity и в ASP.NET StoreFront: Внедрение зависимостей вы можете увидеть больше о Внедрении зависимостей концепции.

1
ответ дан 26 November 2019 в 21:57
поделиться

Если вы хотите увидеть контейнер IoC под колпаком, а также точку (Dependency Injection), на DNR TV есть отличный подкаст ( Episode 126 ) это действительно подробно описывает, как их создавать, зачем они вам нужны. Это действительно замечательный подкаст. Посмотрев это видео, вы сможете посмотреть Unity , Ninject , StructureMap и т. Д. И понять, что они делаешь

8
ответ дан 26 November 2019 в 21:57
поделиться

Я использую Unity для своего контейнера IoC, но разница между контейнерами заключается не только в том, что вы можете сделать с DI.

DI (Dependency Injection) - это в основном способ чтобы получить более слабую связь между разрозненными частями вашей программы. Итак, если вы написали игру, которая вам нравится, как она работает, с помощью DI вы можете изменить персонажей или физический движок в игре, не меняя другие части игры, поэтому, если кто-то платит больше денег, он получает более реалистичный движок, или более качественные символы, но поскольку больше ничего не меняется, тестирование становится проще.

Модульное тестирование также легче с DI, поскольку вы можете макетировать базу данных, например, просто изменив реализацию, которая будет использоваться приложением , не влияя ни на что другое.

Если вы используете Spring.NET, например, вы получите доступ к очень мощному фреймворку, но он может многое сделать, что вы не будете использовать, поэтому ищите что-то меньшее. Я думаю, что лучшее правило - найти самую маленькую и простую реализацию, которая соответствует вашим потребностям, и использовать ее.

0
ответ дан 26 November 2019 в 21:57
поделиться

Помните о следующих ограничениях контейнера IOC. Я должен предупредить людей, потому что я живу с адом необходимости поддерживать систему, использующую ее:

  • Исключения, создаваемые конструкторами, проглатываются. Вы получаете только исключение «не удалось создать зависимость». Это означает, что вы не можете поймать ожидаемые исключения, если они переданы в конструктор.
  • Невозможно выполнить переход по конструкторам.
  • Если вы забудете зарегистрировать интерфейс, он прерывается во время выполнения, а не во время компиляции.
  • Все ваши классы могут только имеют один конструктор, и все они должны принимать интерфейсы в качестве параметров.
  • Все зависимости создаются, поэтому вы не можете совместно использовать экземпляры, что означает, что использование вашей памяти может быстро увеличиваться.
  • Это способствует множеству взаимозависимостей, которые могут скрыть тот факт, что ваш код превратился в спагетти.
23
ответ дан 26 November 2019 в 21:57
поделиться
Другие вопросы по тегам:

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