我担心我可能遗漏了一些基本/基本的东西。我正在尝试在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()
);
我的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正确处理Views / ViewModel的任何亮点。当视图关闭时,我需要View,并且为它创建的任何依赖项都会被破坏。
感谢您的帮助。