2

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

我有一个名为 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()
    );

我的 IViewFactory 很简单:

public interface IViewFactory
{
    T Create<T>()
    void Release(IView view)
}

我正在使用我的 ViewFactory 来创建我的视图实例:

ViewFactory.Create<DemoView>();

在我的 DemoView 的构造函数中,我有一个用于 IViewModel 接口的参数,这样 Castle.Windsor 就可以解析和注入一个实例。当表单关闭时,我明确地尝试释放视图。

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);
    }
}

对于如何正确处理 Castle.Windsor 的视图/视图模型,我将不胜感激。当视图关闭时,我需要视图以及为它创建的任何依赖项都被销毁。

谢谢你的帮助。

4

0 回答 0