有没有人观察到 Windsor 容器的这个错误,这是我面临的问题的一个例子。 A 类实现了接口(interface) I,并且 A 和 I 都在容器中注册为 Singleton。在应用程序 Load 期间,'class 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);
}
}
}
这是输出
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 比我更可信的人:)),只有容器处理强制执行新的决议。
如果您需要链接到用户 session 的生命周期,也许您应该调查 custom lifecycles而不是一个不符合你需求的单例
关于c# - 温莎容器生活方式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29274432/