C# 温莎集装箱生活方式问题

C# 温莎集装箱生活方式问题,c#,dependency-injection,castle-windsor,C#,Dependency Injection,Castle Windsor,有没有人注意到Windsor容器的这个bug,这就是我面临的问题的一个例子。类A实现接口I,并且A和I都作为单例在容器中注册。在应用程序加载期间,解析“A类”并完成一些处理。在应用程序注销期间,容器实例被释放。 当我们再次登录到同一个应用程序时,当“类A”得到解析时,我们仍然得到在容器被释放之前解析的相同对象。通过比较对象的Hashcode多次确认了这一点 这似乎是一个问题,并且在逻辑上不理解即使容器对象在dispose方法中设置为null,如何返回相同的对象 期待其他伟人的合理逻辑。我认为你把

有没有人注意到Windsor容器的这个bug,这就是我面临的问题的一个例子。类A实现接口I,并且A和I都作为单例在容器中注册。在应用程序加载期间,解析“A类”并完成一些处理。在应用程序注销期间,容器实例被释放。 当我们再次登录到同一个应用程序时,当“类A”得到解析时,我们仍然得到在容器被释放之前解析的相同对象。通过比较对象的Hashcode多次确认了这一点

这似乎是一个问题,并且在逻辑上不理解即使容器对象在dispose方法中设置为null,如何返回相同的对象


期待其他伟人的合理逻辑。

我认为你把释放和处置错了。你不能释放一个单例,它和你的容器一起生活,直到容器本身放弃(即被释放)

然而,处理容器确实会迫使再次解析单例。这是我试过的一些代码

namespace WindsorTest
{
    public interface ISingleton  {}

    public class Singleton : ISingleton
    {
        public static int instance = 0;
        public Singleton() { Console.WriteLine("I live anew as instance {0}", instance++); }
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            TheCircleOfLife(false);
            TheCircleOfLife(true);

            Console.ReadLine();
        }

        private static void TheCircleOfLife(bool disposeBetweenReleases)
        {
            Console.WriteLine("I {0}dispose between resolves", disposeBetweenReleases ? "" : "don't ");
            var container = new WindsorContainer();
            container.Register(Component.For<ISingleton>().ImplementedBy<Singleton>().LifestyleSingleton());
            ISingleton singleton = container.Resolve<ISingleton>();
            container.Release(singleton);
            if (disposeBetweenReleases) container.Dispose();
            singleton = container.Resolve<ISingleton>();
            container.Release(singleton);
        }
    } 
}
就我所见,这不是一个bug:释放一个单例没有任何作用,因为单例生活在一个全局状态中(由比我更可信的人:),只有容器处理强制执行一个新的解决方案


如果您需要一个链接到用户会话的生命周期,也许您应该进行调查,而不是一个与您的需求不匹配的单一生命周期

有趣!我猜你可能期望上下文“删除”单例,但同样“真正的”单例也不能删除。CW的手册确实说它将是“当它注册的容器被释放时,唯一的实例将被释放”,所以我猜这是一个bug。但是当你的应用程序需要多个版本时,你真的应该使用单例吗?虽然我注意到你说“容器对象设置为null”,但你真的调用了容器上的dispose方法吗?请发布代码,让我们重现这个。我的第一印象是你做错了什么,但是没有代码,我们无法验证或给出任何反馈。Suresh,你有机会回到你的代码并检查你关于发布/处置问题的断言吗?嗨,首先感谢你花了大量宝贵的时间来调查和回复。如果我理解正确,singleton状态是特定于容器生命周期的,因此当容器被释放时,它还应该返回一个新的singleton实例。这为我提供了在处理容器之前创建的对象。@SureshSharma您能举个例子说明您在说什么吗?在这次测试中,我没有观察到这一点
I don't dispose between resolves
I live anew as instance 0
I dispose between resolves
I live anew as instance 1
I live anew as instance 2