温莎城堡处置命令

本文关键字:命令 城堡 | 更新日期: 2023-09-27 18:37:17

我在使用温莎城堡处理已解析组件的顺序时遇到问题。可以在以下代码中演示此问题

class Program
{
    static void Main(string[] args)
    {
        using (WindsorContainer container = new WindsorContainer())
        {
            container.Register(Component.For<C1>().LifestyleSingleton());
            container.Register(Component.For<C2>().LifestyleTransient());
            C1 c1 = container.Resolve<C1>();
            container.Release(c1);
            Console.WriteLine("Release done");
        }
        Console.WriteLine("Container dispose done");
    }
}
public class C1 : IDisposable
{
    private C2 m_c2;
    public C1(C2 c2)
    {
        m_c2 = c2;
    }
    public void Dispose()
    {
        Console.WriteLine("Dispose C1");
    }
}
public class C2 : IDisposable
{
    public void Dispose()
    {
        Console.WriteLine("Dispose C2");
    }
}

它打印出以下内容:

发布完成处置 C2处置 C1处置 C2容器处理完成

我期望以下输出:

发布完成处置 C1处置 C2容器处理完成
在 C1

之前处理 C2 可能会导致 C1 出现严重问题。C1 仍然可以活着并正在处理某些东西。请注意,当两个组件都注册到 LifestyleSingleton 或 LifestyleTransient 时,问题就会消失,但仍然存在将 C2 注册为 LifestyleTransient 很有用的情况。

有没有办法注册或解析组件来解决此问题?

温莎城堡处置命令

我通过使用作用域并将 C1 注册为作用域解决了这个问题。在这种情况下,处置顺序是正确的。但我不确定这是否是推荐的方法。