Castle Windsor处理订单

时间:2015-01-12 14:56:20

标签: c# .net castle-windsor

使用Windsor Castle处理已解析组件的处理顺序时遇到问题。可以通过以下代码

来演示该问题
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");
    }
}

打印出以下内容:

Release done
Dispose C2
Dispose C1
Dispose C2
Container dispose done

我希望得到以下输出:

Release done
Dispose C1
Dispose C2
Container dispose done

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

有没有办法注册或解决组件来解决这个问题?

1 个答案:

答案 0 :(得分:0)

我通过使用范围并将C1注册为Scoped解决了这个问题。在这种情况下,处置订单是正确的。但我不确定这是否是推荐的方式。