Вы ничего не видите на терминале из-за опечатки в выводе printf("main/n");
printf
не сбрасывается в stdout
и созданные потоки потребляют цикл навсегда, или, по крайней мере, в течение длительного времени.
Вы должны добавить fflush(stdout);
после оператора printf
, чтобы проверить это.
Затем вы можете попробовать printf("main\n");
без fflush()
проверить, что stdout
буферизована строкой, то есть: вывод сбрасывается на терминал, когда выводится новая строка.
Если вы перенаправляете вывод в файл, stdout
обычно полностью буферизуется, поэтому вы должны добавить явное fflush(stdout);
после каждой операции вывода, чтобы вы могли видеть результат в выходном файле на лету или после убийства программы. .
Обратите внимание, что для большинства пользователей код будет легче читать, если вы используете английские слова для идентификаторов, типов, комментариев и сообщений.
Я немного использовал 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
.
Надеюсь, это поможет!
Проверьте Spring IoC (.net) a java / .net контейнер. Документация довольно хорошее введение.
Вкратце: Вы можете думать об IoC как о архитектуре, которая поощряет: составление объектов и программирование на интерфейс .
Это дает вам следующее:
возможность легкого модульного тестирования вашего кода (вы можете легко тестировать ваши объекты изолированно, копируя все его зависимости).
Очень продвинутая конфигурация (потому что ваша программа с IoC это просто набор объектов и конфигурация, которая склеивает объекты вместе.
Возможность расширять или модифицировать байтово скомпилированное приложение (это верно для Java, я не уверен, верно ли это для .net).
Мы используем Ninject из-за его простого API и быстрого разрешения объектов. Он очень хорошо документирован и использует функции C # 3.0, такие как лямбда-выражения, для упрощения спецификации.
Вы можете найти несколько скринкастов по Ninject здесь
Вы пытаетесь создать контейнер IoC, почему бы не использовать один из доступных, таких как Spring.NET, StructureMap или Unity Блок приложения? Здесь список проектов IoC с открытым исходным кодом
Я обычно использую StructureMap - в основном потому, что я знаком с синтаксисом. Я также слышал хорошие новости об autofac , и я с нетерпением жду возможности попробовать Ninject , когда он достигнет v2.
Возможно, вы захотите взглянуть на этот ответ , где я говорю об основном использовании контейнера IoC (я всегда думаю, что вещи проще понять на простом примере) - это может помочь вам понять вещи немного больше. По сути, контейнер IoC помогает вам создавать объекты со всеми удовлетворенными зависимостями и позволяет изменять ваши зависимости с минимальным кодом конфигурации.
Попробуйте прочитать Введение в блок приложений Unity и в ASP.NET StoreFront: Внедрение зависимостей вы можете увидеть больше о Внедрении зависимостей концепции.
Если вы хотите увидеть контейнер IoC под колпаком, а также точку (Dependency Injection), на DNR TV есть отличный подкаст ( Episode 126 ) это действительно подробно описывает, как их создавать, зачем они вам нужны. Это действительно замечательный подкаст. Посмотрев это видео, вы сможете посмотреть Unity , Ninject , StructureMap и т. Д. И понять, что они делаешь
Я использую Unity для своего контейнера IoC, но разница между контейнерами заключается не только в том, что вы можете сделать с DI.
DI (Dependency Injection) - это в основном способ чтобы получить более слабую связь между разрозненными частями вашей программы. Итак, если вы написали игру, которая вам нравится, как она работает, с помощью DI вы можете изменить персонажей или физический движок в игре, не меняя другие части игры, поэтому, если кто-то платит больше денег, он получает более реалистичный движок, или более качественные символы, но поскольку больше ничего не меняется, тестирование становится проще.
Модульное тестирование также легче с DI, поскольку вы можете макетировать базу данных, например, просто изменив реализацию, которая будет использоваться приложением , не влияя ни на что другое.
Если вы используете Spring.NET, например, вы получите доступ к очень мощному фреймворку, но он может многое сделать, что вы не будете использовать, поэтому ищите что-то меньшее. Я думаю, что лучшее правило - найти самую маленькую и простую реализацию, которая соответствует вашим потребностям, и использовать ее.
Помните о следующих ограничениях контейнера IOC. Я должен предупредить людей, потому что я живу с адом необходимости поддерживать систему, использующую ее: