c# - 温莎容器生活方式问题

标签 c# dependency-injection castle-windsor

有没有人观察到 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/

相关文章:

c# - List 的一般问题

unit-testing - 使用依赖 Inj 进行单元测试的依赖破坏技术

c# - 指定用于使用 CaSTLe Windsor 注册组件的实例

asp.net-mvc - SportStore : WebUI. WindsorControllerFactory.GetControllerInstance(System.Type:找不到合适的方法来覆盖

c# - 如何将Wordpress网站集成到ASP.Net中?

c# - 如何使用定时器等待?

c# - 调用存储过程时使用 Entity Framework 处理响应时出错

javascript - 有没有办法在 NestJS 中使用静态方法和依赖注入(inject)?

php - 最好的做法是始终将数据库连接保持在单个实例中吗?

.net - 如何将拦截器添加到 CaSTLe Windsor 中的 Typed Factory Facility 工厂方法