Кусочки, необходимые для использования MVVM Framework - PullRequest
3 голосов
/ 17 сентября 2010

Когда моя компания переходит на платформу .NET из VB6, похоже, что мы движемся в направлении WPF (мой начальник влюблен в элемент управления ленты в стиле Office). Я работал над макетом одного из наших приложений VB6 в WPF и решил одновременно поэкспериментировать с MVVM. Мне не рекомендуется использовать существующую инфраструктуру MVVM, поэтому я думаю, что мне нужно написать свою собственную. Самой большой проблемой сейчас является способ регистрации и управления всеми моими представлениями из центрального места - класса менеджера, - но я не совсем уверен, как это реализовать. Я вижу статью о IoC и ServiceLocator, но у меня есть время применить эти идеи.

Есть ли у кого-нибудь предложения по функциям и шаблонам, которые я должен реализовать, чтобы сделать очень легковесную, но работоспособную инфраструктуру MVVM? Помимо существующей инфраструктуры, какие ресурсы кода вы бы использовали, чтобы помочь продвинуть этот проект, как этот?

Ответы [ 4 ]

4 голосов
/ 17 сентября 2010

Я настоятельно рекомендую вам посмотреть презентацию "Создайте свою собственную MVVM Framework" от Роб Айзенберг создатель Caliburn Framework .Он проведет вас через основные аспекты, необходимые для создания вашей MVVM Framework.Также IMHO Caliburn - одна из лучших 100 + фреймворков "MVVMish".В нем много свежих идей и приятных деталей реализации.Существует также платформа Calibrun Micro , которая представляет собой упрощенную более полную версию полной платформы и является хорошей отправной точкой для изучения того, как все можно сделать.

Я бы такжеПредполагаю, что вы не смотрите слишком далеко на MVVM.Даже в WPF есть распространенные сценарии, которые лучше обрабатываются с использованием других шаблонов, таких как MVC, MVP.Infact Caliburn использует все эти шаблоны.Так что на самом деле, это не совсем справедливо, называя это инфраструктурой MVVM.

0 голосов
/ 18 сентября 2010

Я думаю, что это хорошая идея - создать свою собственную инфраструктуру MVVM.

Я думаю, что это менее удачная идея - без изучения других фреймворков MVVM, изучения инструментов, которые они включают, и понимания их дизайна.Создание минимально полезного инструментария MVVM - это не большая работа, но это большая работа, чтобы выяснить, какие инструменты вам нужно собрать.

Кроме того, если вы посмотрите на то, как это делают другие разработчикиРешив некоторые проблемы, с которыми, по вашему мнению, вы сталкиваетесь, вы можете обнаружить, что еще не поняли проблему.

0 голосов
/ 17 сентября 2010

С ваших слов, я предполагаю, что ваша проблема не в MVVM, а в проблеме навигации.

При запуске у меня возникла та же проблема, и я не был уверен, как реализовать создание представлений и навигацию.между ними.

Взгляните на Magellan Framework .Это делает навигацию и многое другое.

0 голосов
/ 17 сентября 2010

Я только начал использовать следующие интерфейсы для создания облегченной инфраструктуры MVVM, предназначенной для введения управления в управление в существующем приложении.

public interface IView<C>
    where C : class
{
}

public interface IView<C, VM> : IView<C>
    where C : class
    where VM : IViewModel
{
    IDisposable Bind(VM viewModel);
}

public interface IViewModel : INotifyPropertyChanged
{
}

public interface IViewModel<M> : IViewModel
    where M : class
{
    IView<C> Bind<C>(M model) where C : class;
    IView<C> Bind<C>(string key, M model) where C : class;
}

public interface IViewModel<VM, M> : IViewModel<M>
    where VM : IViewModel<VM, M>
    where M : class
{
}

Следующие интерфейсы являются примером Person модель и модель представления.

public interface IPerson : INotifyPropertyChanged
{
    string Name { get; set; }
    DateTime? Dob { get; set; }
}

public interface IPersonViewModel : IViewModel<IPersonViewModel, IPerson>
{
    string Name { get; set; }
    DateTime? Dob { get; set; }
    int? Age { get; }
    string Title { get; }
}

А реализация представления, использующая только привязку данных, выглядит следующим образом:

[Factory(typeof(IView<Control, IPersonViewModel>))]
public partial class PersonView : UserControl, IView<Control, IPersonViewModel>
{
    public PersonView()
    {
        InitializeComponent();
    }

    public IDisposable Bind(IPersonViewModel viewModel)
    {
        this.personViewModelBindingSource.DataSource = viewModel;
        return Disposable.Create(() => this.personViewModelBindingSource.Dispose());
    }
}

Теперь, чтобы использовать все это, я просто набрал следующий код:

var personM = context.Resolve<IPerson>();
var personVM = context.Resolve<IPersonViewModel>();
var personV = personVM.Bind<Control>(personM);

var personC = personV.AsControl();
personC.Dock = DockStyle.Fill;
this.panel1.Controls.Add(personC);

Я использую внедрение зависимостей для разрешения экземпляров моей модели, представления модели и представления. Метод Bind модели представления разрешает представление. Все это строго типизировано и позволяет нам писать модели представлений, которые можно использовать с Windows Forms, WPF & Silverlight.

Надеюсь, вам этого будет достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...