Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Придерживание одного контейнера не действительно важно, если Ваша система была разработана с МОК/DI в памяти. С надлежащим подходом можно легко изменить библиотеку IoC в будущем.
И, конечно, контейнер должен обеспечить достаточно гибкости для поддержки общих широко используемых сценариев (управление жизненным циклом, надлежащее контейнерное вложение, XML и конфигурация кода, перехват, быстрое разрешение).
я рекомендовал бы выбрать между Замком (широко используемый и иметь много библиотек интеграции) и Autofac (легкий вес, быстро и имеет надлежащее контейнерное вложение, но не, что широко используемый)
существует всесторонний список контейнеров МОК Hanselman
пз: Вы не хотите использовать Единицу
Недавно пронзив использование 6 из них ( Виндзор , Единица , Spring. Сеть , Autofac, Ninject, StructureMap) я могу предложить быструю сводку каждого, наших критериев выбора и нашего заключительного выбора.
Примечание: мы не смотрели на PicoContainer. Сеть как одна из наших команд полагала, что.Net порт был довольно плох от версии Java. Мы также не смотрели на ObjectBuilder, поскольку Единица создается сверху ObjectBuilder2 и считалась превосходящим выбором по умолчанию.
Во-первых, я могу сказать, что более или менее все они все довольно подобны, и это действительно сводится к тому, что действительно работает лучше всего на Вас и Ваши конкретные требования. Наши требования включали:
ILogger -> typeof(FileLogger)
или ILogger -> new FileLogger()
) IDisposable
компоненты на контейнере разъединяют хорошо зарегистрированная и/или информация онлайн, легко доступная
Примечание: пока производительность была требованием, она не была включена в выбор, поскольку казалось, что все рассмотренные контейнеры были подобны согласно этому сравнительный тест
, Каждый контейнер использовался у типичного Asp. Сетевой проект веб-форм (поскольку это было нашим типом целевого приложения). Мы использовали единственную простую страницу с с единственным простым пользовательским элементом управления, каждый наследовавшийся базовой странице / основывает управление соответственно. Мы использовали 1 контейнер на BasePage
для "на запрос", определяют объем контейнера и 1 на global.asax для объема "приложения" и предпринятый для объединения в цепочку их вместе, таким образом, зависимости могли быть разрешены от обоих контейнеров.
Каждое веб-приложение совместно использовало изобретенный набор объектов области, моделирующих мультиуровни зависимости, тип объема (одиночный элемент/переходный процесс) и также управляемых и неуправляемых классов (IDisposable
требуемый). "Высокоуровневые" компоненты зависимости были вручную введены из методов на BasePage
.
Виндзор - Удовлетворенный все критерии и имеет хороший наглядный пример, сообщество блоггера и онлайн-документацию. Простой в использовании и вероятно defacto выбор. Усовершенствованное создание компонента через средство Фабрики. Также позволенное объединение в цепочку индивидуально созданных контейнеров.
Spring. Сеть - Подробная и бесполезная документация и неочевидный / легкий для программируемой конфигурации. Не поддерживал дженериков. Не выбранный
Ninject - Простой в использовании с хорошей четкой документацией. Набор мощной функции, выполняющий все наши требования кроме контейнерных иерархий поэтому, к сожалению, не был выбран.
StructureMap - Плохо зарегистрированный, хотя настоящий набор расширенной функции, который отвечал всем нашим требованиям, однако не был никаким встроенным механизмом для контейнерных иерархий, хотя мог быть взломан вместе с помощью для циклов, видят здесь лямбда-выражение, быстрый интерфейс действительно казался немногим более, чем сложным сначала, хотя мог инкапсулироваться далеко.
Единица - Хорошо зарегистрированный, простой в использовании и встреченный все наши критерии выбора и имеют легкий механизм расширения для добавления пред/сообщение механизм обработки событий создания, которого мы потребовали. Дочерние контейнеры должны были быть созданы из родительского контейнера.
Autofac - Хорошо зарегистрированный и относительно простой в использовании, хотя конфигурация лямбда-выражения действительно кажется немногим более, чем сложной однако, снова, может легко инкапсулироваться далеко. Обзор компонента достигается через механизм "меток", и все компоненты настроены впереди с помощью разработчика, который был немного неудобен. Дочерние контейнеры были созданы из родителя и присвоенных компонентов от "тега". Позволенная универсальная инжекция.
Наш заключительный выбор был между Виндзором и Единицей, и на этот раз мы выбрали Unity из-за его простоты использования, документации, дополнительной системы и с ним находиться в "производственном" состоянии.
Вот хорошая статья, которая сравнивает.NET контейнеры МОК. http://blog.ashmind.com/index.php/2008/08/19/comparing-net-di-ioc-frameworks-part-1/
Я - поклонник Autofac, но и Виндзор и Единица сделают хорошее задание (хотя Виндзор более способен, чем единица и не требует приписывания Вашего кода). Существует много пользы не технические причины того, чтобы придерживаться единственного контейнера в системе все же.
Используйте что работы. Большинство имеет функции, которые уникальны для них, и почти все более многофункциональны, чем Единица. Если единица - все, в чем Вы нуждаетесь, можно, конечно, использовать ее.
Используя единицу Microsoft просто, потому что это от Microsoft, плохой способ принять решение. Думайте о том, в чем Вы нуждаетесь и почему, и выбирают тот, который соответствует Вашим потребностям.
Однако я второй понятие придерживания единственного контейнера, если это возможно.
Если у Вас уже нет опыта и персонального предпочтения конкретной подтехнологии, используемой одним из возможных решений для контейнера МОК, они все функционируют хорошо, и я не вижу никого в особенности с "уничтожающей функцией", которая заставляет его стоять из других. Единица является, вероятно, лучшим пригодным для решений, уже использующих P& Библиотека P Enterprise 4.x...
Я начал использовать Autofac год назад и не оглядывался с тех пор ..
Я использовал Managed Extensibility Framework и обнаружил, что с ним довольно легко работать. Она была интегрирована в .NET 4.