Castle Windsor - Container.Dispose () приводит к тому, что метод Dispose () вызывается дважды - PullRequest
1 голос
/ 21 июня 2019

У меня есть два класса, один вводится другим: -

public class A : IClassA
{
    public A(IClassB b)
    {
       ...
    }
}

public class B : IClassB, IDisposable
{
   ...
}

И они зарегистрированы так: -

container.Register(Component.For<IClassA>().ImplementedBy<A>().LifeStyle.Singleton);
container.Register(Component.For<IClassB>().ImplementedBy<B>().LifeStyle.Transient);

Когда я закрываю свою заявку, я звоню Container.Dispose(). В этот момент я обнаружил, что метод Dispose() класса "B" вызывается дважды. Если я зарегистрирую класс "B" как singleton , он будет вызван только один раз. Почему это?

Я использую Castle Windsor v3.3.0.

Вот стеки вызовов из двух вызовов Dispose (), если это помогает (я обрезал их в точке, где я вызываю Container.Dispose()).

Первый вызов Dispose ():

Castle.Windsor.dll! Castle.MicroKernel.LifecycleConcerns.DisposalConcern.Apply (модель Castle.Core.ComponentModel, компонент объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.ApplyConcerns (System.Collections.Generic.IEnumerable шаги, экземпляр объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.ApplyDecommissionConcerns (экземпляр объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalDestroy (экземпляр объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Destroy (экземпляр объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Release (экземпляр объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.Handlers.DefaultHandler.ReleaseCore (Заметка.MicroKernel. Бремя нагрузки) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.Handlers.AbstractHandler.Release (Castle.MicroKernel. Бремя нагрузки) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.Burden.Release () Неизвестный Castle.Windsor.dll! Castle.MicroKernel.Releasers.LifecycledComponentsReleasePolicy.Dispose () Неизвестно Castle.Windsor.dll! Castle.Facilities.TypedFactory.Internal.TypedFactoryInterceptor.Dispose () Неизвестно Castle.Windsor.dll! Castle.MicroKernel.LifecycleConcerns.DisposalConcern.Apply (модель Castle.Core.ComponentModel, компонент объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.ApplyConcerns (System.Collections.Generic.IEnumerable шаги, экземпляр объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.ApplyDecommissionConcerns (экземпляр объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalDestroy (экземпляр объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Destroy (экземпляр объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Release (экземпляр объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.Handlers.DefaultHandler.ReleaseCore (Заметка.MicroKernel. Бремя нагрузки) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.Handlers.AbstractHandler.Release (Castle.MicroKernel. Бремя нагрузки) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.Burden.Release () Неизвестный Castle.Windsor.dll! Castle.MicroKernel.Releasers.LifecycledComponentsReleasePolicy.Dispose () Неизвестно Castle.Windsor.dll! Castle.MicroKernel.DefaultKernel.DisposeComponentsInstancesWithinTracker () Неизвестно Castle.Windsor.dll! Castle.MicroKernel.DefaultKernel.Dispose () Неизвестно Castle.Windsor.dll! Castle.Windsor.WindsorContainer.Dispose () Неизвестно

Второй вызов Dispose ():

Castle.Windsor.dll! Castle.MicroKernel.LifecycleConcerns.DisposalConcern.Apply (модель Castle.Core.ComponentModel, компонент объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.ApplyConcerns (System.Collections.Generic.IEnumerable шаги, экземпляр объекта) НеизвестноCastle.Windsor.dll! Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.ApplyDecommissionConcerns (экземпляр объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalDestroy (экземпляр объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Destroy (экземпляр объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Release (экземпляр объекта) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.Handlers.DefaultHandler.ReleaseCore (Заметка.MicroKernel. Бремя нагрузки) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.Handlers.AbstractHandler.Release (Castle.MicroKernel. Бремя нагрузки) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.Burden.Release () Неизвестный Castle.Windsor.dll! Castle.MicroKernel.Burden.Release.AnonymousMethod__0 (Castle.MicroKernel.Burden c) Неизвестный mscorlib.dll! System.Collections.Generic.List.ForEach (действие System.Action) Неизвестно Castle.Windsor.dll! Castle.MicroKernel.Burden.Release () Неизвестный Castle.Windsor.dll! Castle.MicroKernel.Lifestyle.SingletonLifestyleManager.Dispose () Неизвестно Castle.Windsor.dll! Castle.MicroKernel.Handlers.DefaultHandler.Dispose () Неизвестно Castle.Windsor.dll! Castle.MicroKernel.DefaultKernel.DisposeHandler (обработчик Castle.MicroKernel.IHandler) Неизвестный Castle.Windsor.dll! Castle.MicroKernel.DefaultKernel.DisposeHandlers () Неизвестно Castle.Windsor.dll! Castle.MicroKernel.DefaultKernel.Dispose () Неизвестно Castle.Windsor.dll! Castle.Windsor.WindsorContainer.Dispose () Неизвестно

...