2

基本的/基本的な何かが欠けているのではないかと心配しています。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/ViewModels を適切に処理する方法を教えていただければ幸いです。ビューが閉じられたら、ビューと、そのために作成されたすべての依存関係を破棄する必要があります。

ご協力いただきありがとうございます。

4

0 に答える 0