Windsor Container LifeStyle问题

时间:2015-03-26 09:00:22

标签: c# dependency-injection castle-windsor

有没有人观察过Windsor容器的这个错误,这是我面临的问题的一个例子。 A类实施接口I,A和A都是我在容器中注册为Singleton。在申请期间加载' A'已解决,并完成了一些处理。在应用程序注销期间,容器实例被丢弃。 当我们再次登录同一个应用程序时,当A'得到解决后,我们仍然得到在处置容器之前解决的相同对象。通过比较对象的Hashcode,多次重新确认了这一点。

这似乎是个问题,即使在dispose方法中将容器对象设置为null,逻辑上仍然无法理解返回相同的对象。

期待其他伟大思想的合理逻辑。

1 个答案:

答案 0 :(得分:0)

我认为你错误地发布和处理。你不能释放一个单身,它与你的容器一起存在,直到容器本身放弃(即被丢弃)。

然而,处置容器会强制再次解决单例。这是我试过的一些代码

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);
        }
    } 
}

这是输出

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

据我所知,这不是一个错误:发布一个单身人士并没有做任何事情,因为单身人士生活在一个全球状态(here it is said again被一个比我更可信的人:),只有集装箱处置迫使新决议。

如果您需要与用户会话相关联的生命周期,也许您应该调查custom lifecycles而不是不符合您需求的单身