Unity RegisterInstance IDisposable объектов

Unity 2.0:

по умолчанию RegisterInstance использует ContainerControlledLifetimeManager. Когда контейнер Unity удален, он вызывает Dispose на экземпляре (если IDisposable).

в моем случае это не то, что я хочу. Экземпляр принадлежит и утилизируется другим классом; Unity должен просто ввести ссылку. Поэтому я использовал:

container.RegisterInstance(instance, new ExternallyControlledLifetimeManager());

в документации Unity (под пониманием менеджеров времени жизни) говорится:

использование RegisterInstance метод для Регистрация существующего объекта приводит к такое же поведение, как если бы вы просто зарегистрированы контейнер жизни RegisterType. Поэтому не рекомендуется использовать RegisterInstance способ регистрации существующий объект при использовании менеджеры времени жизни не по умолчанию, за исключением для нити, в которой RegisterInstance был вызван.

что это значит?

тот же раздел также государства:

Если вы зарегистрировали существующий экземпляр объекта, использующего RegisterInstance метод, контейнер возвращает один и тот же экземпляр для всех вызовы для разрешения или ResolveAll или когда механизм зависимости вводит экземпляры в другие классы, предоставленные верно одно из следующих утверждений:--2-->

  • вы указали container-container-container lifetime manager
  • вы использовали диспетчер жизни по умолчанию
  • вы разрешаете в том же контексте, в котором вы зарегистрировали экземпляр при использовании другого пожизненный менеджер.

Я попытался разрешить в другом потоке после использования RegisterInstance с ExternallyControlledLifetimeManager, и это сработало - я получил экземпляр singleton.

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

чтобы быть ясным, я всегда хочу, чтобы контейнер Unity вводил экземпляр, который я зарегистрировал, независимо от потока и т. д. и я это делаю!--34-->не хочу, чтобы Unity избавилась от него. Правильно ли я это делаю?

2 ответов


Я думаю, что Вы хороши. Все комментарии для каждого потока имеют значение только при использовании PerThreadLifetimeManager, который вы не используете. Это просто неуклюжая формулировка в части статьи MSDN.

Это не стандартная терминология, но в этой статье под контекстом они подразумевают что-то определенное конкретным менеджером времени жизни. Для PerThreadLifetimeManager ваш контекст потока. Для HierarchicalLifetimeManager вашем контексте конкретного контейнера в контейнер иерархия.

для ExternallyControlledLifetimeManager нет определенного контекста, поэтому вы можете полностью игнорировать рассматриваемую заметку.

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


курсе ExternallyControlledLifetimeManager. Вы все равно должны удерживать ссылку на экземпляр где-то вне контейнера. Как только вы потеряете ссылку вы можете потерять экземпляр, потому что ExternallyControlledLifetimeManager держит только WeakReference. Если у вас нет обычной ссылки, сборщик мусора может собрать ваш экземпляр. Проверка пример на моем блоге.