Каков наилучший способ зарегистрировать WPF ViewModels против Views в контейнере AutoFac? - PullRequest
0 голосов
/ 11 июня 2019

Мне не удалось найти руководство по регистрации представлений и моделей представления в AutoFac.Моя цель - сделать так, чтобы при создании представления (системой или через службу создания представления) указанный viewModel разрешался AutoFac и применялся к DataContext представления.

Вот несколько хакерское решение, которое ядо сих пор:

builder.Register(t => new CatView() { DataContext = t.Resolve<CatListViewModel>() });

Это работает в том, что viewModel создается и применяется как DataContext при создании представления. Но метод dispose () viewModel не будет вызываться до тех пор, пока не закончится время жизни области (когда приложение закрыто?), Что может привести к утечкам памяти, так как новая viewModel создается при каждом открытии представления.

Я считаю, что другие структуры DI, такие как Ninject и Prism, имеют определенные регистрационные вызовы view / viewModel, что заставляет меня думать, что я делаю что-то не так.Пожалуйста, дайте мне знать о лучшем подходе к просмотру / просмотру модельной регистрации с помощью AutoFac.

Ответы [ 2 ]

2 голосов
/ 11 июня 2019

Интересный вопрос о ViewModel / Просмотр времени жизни.Одна из компаний, в которой я работал, использовала первый подход ViewModel, который вам может понравиться.

Они назвали это «Деятельностью».

public interface IActivity<T>
{
    Task<T> Result { get; }
}

public class RegistrationActivity : IActivity<Person>
{
    private TaskCompletionSource _tcs;
    public Task<Person> Result => _tcs.Task;

    public string Name {get;set;}

    public ICommand Ok => new RelayCommand(() => _tcs.SetResult(new Person(Name)));
    public ICommand Cancel => new RelayCommand(() => _tcs.SetCancelled());

}

public class RegistrationWindow : Window
{
    public RegistrationWindow(RegistrationActivity viewModel)
    {
        InitializeComponents();
        DataContext = viewModel;
        viewModel.Task.ContinueWith(() => Close());
    }   
}

builder.Register<RegistrationWindow>();
1 голос
/ 11 июня 2019

Вы делаете все это задом наперед. Одной из основных причин использования MVVM является упрощение модульного тестирования, т. Е. Ваше приложение должно работать без создания каких-либо представлений!

Имея это в виду, обычный способ сопоставления двух в WPF - через DataTemplates, и ваш выбор структуры DI не должен иметь никакого значения. В основном вы делаете это:

<DataTemplate DataType="{x:Type vm:MyViewModelType">
    <views:MyViewControl />
</DataTemplate>

Теперь все, что использует ContentPresenter (ListBoxes и т. Д.), Будет заполняться этим представлением всякий раз, когда его содержимое привязано к соответствующей модели представления. Вы также можете сделать это явно так:

<ContentControl Content="{Binding SomeViewModelProperty}" />

Если вы любите делать что-то нелегко, взгляните на учебники Джонатана Йейтса «Приключения в Xamarin Forms», сами страницы, к сожалению, давно ушли, но вы все равно можете прочитать все на Wayback машина . Это все Xamarin конечно, но очень легко портировать на WPF. Я использовал его в нескольких проектах, но в итоге заменил его на собственный DataTypeSelector, который только что реализовал шаблоны данных в стиле WPF.

...