C# 温莎没有释放我的瞬态组件,即使在我调用Release之后

C# 温莎没有释放我的瞬态组件,即使在我调用Release之后,c#,inversion-of-control,castle-windsor,ioc-container,castle,C#,Inversion Of Control,Castle Windsor,Ioc Container,Castle,我担心我可能遗漏了一些基本的东西。我试图在WinForms/WPF应用程序中使用Castle.Windsor,但我的组件的生活方式遇到了问题 我有一个名为ViewFactory的TypedFactory,用于解析视图。每个视图都需要一个ViewModel,因此我为它们提供了接口,并注册了组件,以便Windsor为我负责注入它们。我一直在使用“暂时”的生活方式,因为我找不到比这更好的生活方式。然后,当我完成后,我尝试“释放”它们,但它们永远留在我身边。这导致内存消耗不断增加 我的注册: conta

我担心我可能遗漏了一些基本的东西。我试图在WinForms/WPF应用程序中使用Castle.Windsor,但我的组件的生活方式遇到了问题

我有一个名为ViewFactory的TypedFactory,用于解析视图。每个视图都需要一个ViewModel,因此我为它们提供了接口,并注册了组件,以便Windsor为我负责注入它们。我一直在使用“暂时”的生活方式,因为我找不到比这更好的生活方式。然后,当我完成后,我尝试“释放”它们,但它们永远留在我身边。这导致内存消耗不断增加

我的注册:

container.AddFacility<TypedFactoryFacility>

container.Register(
    Component.For<IDemoViewModel>()
        .ImplementedBy<DemoViewModel>()
        .LifestyleTransient(),
    Component.For<IDemoView>()
        .ImplementedBy<DemoView>()
        .LifestyleTransient(),
    Component.For<IViewFactory>()
        .AsFactory()
    );
我非常感谢您为我介绍如何使用Castle.Windsor正确处理视图/视图模型。当视图关闭时,我需要销毁该视图以及为其创建的任何依赖项


谢谢您的帮助。

您确定温莎保留了对您的组件的引用吗?您可以在调试器中检查这一点。感谢您的回复,Marwijn。我根据检查了调试器,我确实看到Castle.Windsor在“发布策略跟踪的对象”集合下持有对我的组件的引用。我设置了断点,并观察到以下情况:在解析视图之前(集合中没有视图/模型),在解析视图之后(集合中的视图/模型),以及在调用ViewFactory.Release之后(视图/视图模型仍在集合中)。我还在Finalize方法中设置了一个断点,直到我处理完容器后才调用它。什么可以阻止.Release完成它的工作?通常释放组件的类型化工厂与创建组件的类型化工厂相同。查看您的代码示例似乎不是这样的……将工厂注入到由同一工厂创建的对象中。你可以考虑一个“组成根”的方法来创建你的视图或者一个主成分,它作为一个依赖于一个创建和释放视图的工厂的依赖根,相信我已经有了一个合成根。这就是我创建容器、注册安装程序、解析主视图并最终处理容器的地方,对吗?我的问题是,我的“主”视图中注入了一个ViewFactory,它创建的视图将一直挂起,直到容器被处理掉。我在谷歌上搜索了几个小时,找不到一个关于如何将Castle.Windsor与WPF结合使用的工作示例,这个示例没有显示出与我相同的内存泄漏。有没有人知道一个例子可以解决这个问题——即使这意味着改变我的方法。谢谢。我还以为是用另一个容器发布的,但看看注册码,工厂似乎是个单身汉。因此,这不应构成问题。这可能有点离题,但为什么不使用Caliburn.Micro这样的工具来耦合视图和视图模型呢?
public interface IViewFactory
{
    T Create<T>()
    void Release(IView view)
}
ViewFactory.Create<DemoView>();
public class DemoView
{
    public IViewFactory ViewFactory { get; set; }

    private IDemoViewModel _viewModel;

    public DemoView(IDemoViewModel viewModel)
    {
        _viewModel = viewModel;
        DataContext = _viewModel;

        this.Closed += new FormClosedEventHandler(HandleViewClosing);
    }

    private void HandleViewClosing(Object sender, FormClosedEventArgs e)
    {
        ViewFactory.Release(this);
    }
}