Unity 2.0:
По умолчанию RegisterInstance использует ContainerControlledLifetimeManager. Когда контейнер Unity удаляется, он вызывает Dispose для экземпляра (если IDisposable).
В моем случае это не то, что мне нужно. Экземпляр принадлежит другому классу и управляется им; Unity следует просто ввести ссылку. Итак, я использовал:
container.RegisterInstance(instance, new ExternallyControlledLifetimeManager());
В документации Unity (в разделе «Общие сведения о менеджерах времени жизни») указано:
Использование метода RegisterInstance для зарегистрировать существующий объект приводит к такое же поведение, как если бы вы просто зарегистрировал жизненный контейнер с RegisterType. Следовательно, это рекомендуется не использовать RegisterInstance для регистрации существующий объект при использовании нестандартные менеджеры срока службы, кроме для потока, в котором Был вызван RegisterInstance.
Что это означает?
В том же разделе также говорится:
Если вы зарегистрировали существующий экземпляр объекта с помощью RegisterInstance, контейнер возвращает один и тот же экземпляр для всех вызывает Resolve или ResolveAll или когда механизм зависимости вводит экземпляры в другие классы при условии верно одно из следующих утверждений:
- Вы указали диспетчер времени жизни, управляемый контейнером.
- Вы использовали диспетчер времени жизни по умолчанию.
- Вы выполняете разрешение в том же контексте, в котором зарегистрировали пример при использовании другого диспетчер времени жизни.
Я попытался выполнить разрешение в другом потоке после использования RegisterInstance с ExternalControlledLifetimeManager, и это сработало - я получил экземпляр синглтона.
Мой код соответствует примеру в разделе «Создание экземпляров регистрации». Однако я хочу убедиться, что понимаю контекстные оговорки.
Для ясности, я всегда хочу, чтобы контейнер Unity вставлял экземпляр, который я зарегистрировал, независимо от потока и т. Д., И я не хочу Unity избавиться от него. Правильно ли я делаю это?