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