Hvd был прав: вы должны подготовить свой одноразовый класс, чтобы разрешить несколько Dispose
вызовов.Это правильный способ реализации одноразового шаблона, как описано в нескольких местах, таких как MSDN или CodeProject
Вернуться к исходному вопросу:
Autofacавтоматически вызывать Dispose
для каждого компонента, который разрешается в течение срока действия жизненного цикла, если компонент IDisposable
(в вашем примере область действия - это время существования контейнера, но это может быть любая другая область времени жизни).Так что это один «Утилизация C».
И если вы зарегистрировали компонент с помощью RegisterInstance
, то при вызове контейнера он вызывает Dispose
(даже если они никогда не были разрешены!).Это второй «Утилизация C».
Вы можете отключить эту дополнительную утилизацию, используя ExternallyOwned
:
builder.RegisterInstance(new C()).ExternallyOwned();
Когда вы использовали cb.Register(c => new C());
, тогда Autofac создает экземпляр C
для вас, когда вы звоните Resolve
, чтобы он мог отследить его (он не "принадлежит извне"), поэтому он вызывает только один раз Dispose
, когда заканчивается область litetime.
Вы можете прочитать больше о от AutofacДетерминированное удаление .