Паттерн MVC в Windows Forms. С чем едят?
Доброго времени, уважаемые форумчане.
Пишу приложение которое умеет:
1. Извлекать данные из xml файлов.
Xml файлы:
2 файла с ценами ингредиентов (2 типа ингредиентов, по файлу на каждый).
очень много xml файлов рецептов в которых перечисляются ингредиенты и их количество.
2. Отображать рецепты по категориям (в меню приложения можно выбрать категорию и приложение отобразит только рецепты нужной категории)
3. Отображать материалы для изменения их цен.
В будущем планируется прикрутить сравнение цен приготовления по рецептам для того чтобы понимать что выгоднее готовить, а так же все что придёт в голову.
Наступил момент когда обычное накидывание методов завело в дебри багов и мне посоветовали присмотреться к паттерну MVC.
После прочтения теории по данному паттерну пришло понимание что:
Модель — отвечает за хранение данных и работу непосредственно с этими данными (изменение, вычисление и т.д).
Представление — отвечает за отображение данных пользователю.
Контроллер — посредник между пользователем и моделью(данными). Он передает команды пользователя которые должны повлиять на данные из модели.
Таким образом возникает цепь:
Пользователь использует контроллер который управляет моделью которая обновляет представление которое видит пользователь.
Но я понятия не имею каким образом использовать этот паттерн на практике. То-есть в теории все понятно, но как это реализуется в коде абсолютно не понятно.
Буду безмерно благодарен любой помощи. Если нужна какая-либо дополнительная информация о проекте, пожалуйста, напишите, я дополню. Я бы вывалил весь свой код с удовольствием, но мне посоветовали так не делать т.к там без 50грамм не разобраться.
P.S Я новичок, поэтому отдельная просьба — по возможности используйте слэнг и терминологию по минимуму
Добавлено через 4 часа 29 минут
Уточню свой вопрос.
Я не пойму что именно из моего проекта может относиться к модели, к контроллеру, а что к представлению.
Пожалуйста, набросайте пару идей, просто из головы, пусть просто гипотетические, но по правилам MVC.
Windows forms and mvc
winforms-mvc — A library for MVC pattern in c# Windows Forms Application
MVC for C# Windows Forms
To use the MVC framework, you’ll have to make some changes to the class containing the Main method, defaults to Program.cs in WinForms applications.
The AppManager class is initially used to keep the STA (Single Threaded Apartment) thread running, because WinForms applications run on one single thread. The AppManager singleton can be used to «travel» to different forms using the Load method from this class. The Load method requires a generic type which inherits the abstract Controller class. When the entered generic type is Loadable , it will execute the successhandler of the controller. If the controller was not able to load, the application will prompt a message to the user and exits the application when the message closes using the failedhandler. Both success and failed handlers can be overridden.
Because the AppManager is a singleton, we can use all the functionality of the AppManager instance anywhere in our application once the instance is initialized using Start .
Controllers are used to handle events or other functionalities that should be processed on the backend. I use this MVC framework for pushing and pulling of data on the controller. When the view submits the data entered in it’s form, the data will be send to the controller through events (callbacks) and the controller will insert them in the prefered type of repository .
Every controller must inherit the abstract Controller class or any other unsealed class that is derived from that class.
A Form is defined as a view in this MVC framework. This way we are not only benefitting from the built in designer of Visual Studios, but also the other libraries which alter or extend the designer of the winforms. A view does not know where the data is comming from, it has no relation to anything other than the models .
When data, which was entered or created in the view, should be submitted to the backend, the view has to create an event which the controller can subscribe too to handle the submitted data (eg. store in dbo).
Реализация MVC с Windows Forms
где я могу найти хороший пример о том, как полностью реализовать шаблон MVC в Windows Forms?
Я нашел много учебников и примеров кода на различных сайтах (например, Код Проекта и .NetHeaven), но многие из них более представительны для шаблона наблюдателя, чем MVC. Поскольку приложение, которое я хочу разработать, предназначено для школьного проекта, я неохотно использую фреймворки, такие как PureMVC или MVC#.
6 ответов:
Я считаю, что приложения настолько отличаются друг от друга, и наше понимание того, как приложения должны быть написаны, все еще очень ограничено. Прошлые приложения Windows Forms, над которыми я работал, настолько отличались друг от друга. Некоторые из различий в дизайне, которые я видел (включая большинство комбинаций):
- непосредственно поговорить с базой данных (2 уровня)
- используйте серверную часть, которая была написана для данного приложения (3 уровень)
- используйте набор веб-служб, которые были написаны для использования многими приложениями и не могут быть изменены для вашего приложения. (Сервис-ориентированная архитектура)
- обновление делается с помощью CRUD операции
- обновления выполняются с помощью команда (отправка команд на серверную часть)
- много порядков привязка данных / без использования привязки данных
- большинство данных «таблица как» (например, счета-фактуры), которые хорошо работают в стандартных элементах управления сеткой / нуждаются в пользовательских элементах управления для большинства данных пользовательского интерфейса.
- один разработчик / команды из 10 или 20 разработчиков (только на UI)
- много модульного теста с использованием насмешек и т. д. / Нет модульных тестов
поэтому я не думаю, что можно создать одну реализацию MVC (или MVP), которая всегда хорошо подходит.
лучшие посты, которые я видел на самом деле объяснением MVC и почему an Система MVC построена так, как она есть, это «Построй свою собственную кабину» серия Джереми Д Миллер. После работы хотя вы должны быть в состоянии понять ваши варианты намного лучше. руководство по интеллектуальному клиенту Microsoft (CAB / Microsoft Composite Application Block) также следует учитывать. Это немного сложно, но он может хорошо работать для приложений, которые имеют хорошую подгонку.
выбор реализация MVC/MVP для проекта Winforms дать обзор, который стоит прочитать. Многие люди любят PureMVC. Я никогда не использовал его, но я бы посмотрел на него в следующий раз, когда мне нужна структура MVC.
«Первый Ведущий » — это подход к разработке программного обеспечения, который сочетает в себе идеи Шаблона дизайна Model View Presenter (MVP) и разработка на основе тестов. Это позволяет начать с написания тестов на языке заказчика. Например:
«когда я нажимаю затем нажмите кнопку » Сохранить файл должен быть сохранен и несохраненный файл предупреждение должно исчезнуть.»
У меня нет опыта использования «Presenter First», но я дам ему попробовать, когда у меня будет шанс, так как это выглядит очень многообещающе.
другие вопросы переполнения стека, которые вы можете посмотреть, являются здесь и здесь.
Если вы думаете об использовании WPF в любой момент взглянуть на Model-View ViewModel (MVVM) узор. Вот очень хорошее видео, которое вы должны посмотреть:Джейсон Dolinger на модель-представление-модель представления.
MVVM (Model View View Model) шаблон дизайна для Winforms дайте еще один вариант, который может облегчить преобразование в WPF, если это когда-либо понадобится. волшебно.Тревор является еще одним примером MVVM для Windows Forms, который также включает автоматическую привязку на основе свойства имена.
также спросите себя почему вы используете MVC.
- вы хотите, чтобы иметь возможность модульного тестирования как можно больше кода?
- вы пытаетесь разрешить как можно больше кода для повторного использования?
- вы пытаетесь сделать ваш код базы легко понять?
- 101 другие причины, которые могут быть допустимыми для данного проекта.
Как только вы ясны на вашем цели, оно становится проще выбрать ту или иную реализацию.
обновление: в дополнение к моему предыдущему ответу ниже, я предлагаю прочитать о «ведущий» подход (особенно статьи в формате PDF)
Я бы рекомендовал MVP (PassiveView pattern на самом деле) вместо MVC. Вам не нужны какие-либо специальные механизмы для этого, это просто, как вы организуете свой код.
один подход (который я обычно беру) состоит в том, чтобы разделить каждую форму windows на три сущности:
- класс презентатора / контроллера — это то, с чего вы на самом деле начинаете при разработке формы. Именно здесь должна находиться большая часть/вся ваша «бизнес» логика.
- интерфейс представления (IView), который содержит методы, свойства и события. Этот интерфейс все что ведущий знает о вашей форме.
- в конце, когда вы закончите реализацию презентатора и представления (включая модульные тесты), вы можете создать фактический класс формы и заставить его реализовать интерфейс IView. Тогда это просто вопрос добавления соответствующих элементов управления в форму и подключения их к интерфейсу.
пример кода (простой псевдокод, просто для иллюстрации):
вы смотрели PureMVC? Я обнаружил, что никто не может согласиться с тем, что MVC действительно выглядит, как только они начинают строить конкретную реализацию.
обновление: вы можете построить свой собственный, начиная с чего-то более простого, такого как MobileMVC. Компактный рамках код должен компилироваться/работать нормально в Windows. Поскольку это школьное задание, я бы предложил вам потратить некоторое время на изучение того, как MVC на самом деле работает.
How would you implement MVC in a Windows Forms application?
I don’t develop too many desktop / Windows Forms applications, but it had occurred to me that there may be some benefit to using the MVC (Model View Controller) pattern for Windows Forms .NET development.
Has anyone implemented MVC in Windows Forms? If so, do you have any tips on the design?
6 Answers 6
What I’ve done in the past is use something similar, Model-View-Presenter.
[NOTE: This article used to be available on the web. To see it now, you’ll need to download the CHM, and then view the file properties and click Unblock. Then you can open the CHM and find the article. Thanks a million, Microsoft! sigh]
The form is the view, and I have an IView interface for it. All the processing happens in the presenter, which is just a class. The form creates a new presenter, and passes itself as the presenter’s IView. This way for testing you can pass in a fake IView instead, and then send commands to it from the presenter and detect the results.
If I were to use a full-fledged Model-View-Controller, I guess I’d do it this way:
- The form is the view. It sends commands to the model, raises events which the controller can subscribe to, and subscribes to events from the model.
- The controller is a class that subscribes to the view’s events and sends commands to the view and to the model.
- The model raises events that the view subscribes to.
Implementing MVC with Windows Forms
Where can I find a good example on how to completely implement the MVC pattern in Windows Forms?
I found many tutorials and code examples on various sites (for example, The Code Project and .NetHeaven), but many are more representative for the observer pattern than MVC. Since the application I want to develop is for a school project, I am reluctant to using frameworks like PureMVC or MVC#.
6 Answers 6
I am of the view that applications are so different from each other and our understanding of how applications should be written is still very limited. Past Windows Forms applications I have worked on have been so different from each other. Some of the design differences I have seen are (including most combinations):
- Directly talk to the database (2 tier)
- Use a backend that has been written for the given application (3 tier)
- Use a set of web services that were written for use by many applications and can’t be changed for your application. (Service-oriented architecture)
- Updates being done by CRUD operations
- Updates being done with the command pattern (sending commands to backend server)
- Lots of usages of data binding / no usages of data binding
- Most data being “table like” (e.g. invoices) that work well in standard grid controls / need custom controls for most of the UI data.
- One developer / teams of 10 or 20 developers (just on the UI)
- Lots of unit test using mocks etc / no unit tests
Therefore I don’t think it’s possible to create one implementation of MVC (or MVP) that always fits well.
The best posts I have seen really explaining MVC and why an MVC system is built the way it is, is the «Build Your Own CAB» series by Jeremy D Miller. After working though it you should be able to understand your options a lot better. Microsoft’s Smart Client Guidance (CAB / Microsoft Composite Application Block) should also be considered. It is a bit complex, but it can work well for applications that have a good fit.
Selecting an MVC/MVP Implementation for a Winforms Project give an overview that is worth reading. A lot of people like PureMVC. I have never used it, but I would look at it the next time I need a MVC framework.
«Presenter First» is a software development approach that combines the ideas of the Model View Presenter (MVP) design pattern and test-driven development. It lets you start off by writing tests in the customer’s language. For example:
«When I click the ‘save’ button then the file should be saved and the unsaved file warning should disappear.”
I have no experience using «Presenter First,» but I will give it a try when I get a chance, as it looks very promising.
Other Stack Overflow questions you may may wish to look at are here and here.
If you are thinking of using WPF at any point take a look at the Model-View ViewModel (MVVM) pattern. Here is a very good video you should take a look at: Jason Dolinger on Model-View-ViewModel.
MVVM (Model View View Model) Design Pattern for Winforms give another option that may make it easer to convert to WPF if ever needed. Magical.Trevor is yet another MVVM sample for Windows Forms that also includes auto binding based on property names.
Also ask yourself why you are using MVC.
- Do you wish to be able to unit test as much code as possible?
- Are you trying to allow as much code as possible to be reused?
- Are you trying to make your code base easy to understand?
- 101 other reasons that can be valid for a given project.
Once you are clear on your aims, it becomes easier to choose one implementation or another.