有没有人观察过Windsor容器的这个错误,这是我面临的问题的一个例子。 A类实施接口I,A和A都是我在容器中注册为Singleton。在申请期间加载' A'已解决,并完成了一些处理。在应用程序注销期间,容器实例被丢弃。 当我们再次登录同一个应用程序时,当A'得到解决后,我们仍然得到在处置容器之前解决的相同对象。通过比较对象的Hashcode,多次重新确认了这一点。
这似乎是个问题,即使在dispose方法中将容器对象设置为null,逻辑上仍然无法理解返回相同的对象。
期待其他伟大思想的合理逻辑。
答案 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而不是不符合您需求的单身