我很迷惑.也许你可以帮帮我:)
我一直在遵循CAG的指导,发现MVP模式对我来说非常自然.假设我有一个支持UI的模型(例如:实现INotifyPropertyChanged),我使用演示者将此模型绑定到视图(演示者知道视图的接口),保持我的Code-Behind尽可能小只处理Bindings(模型和命令)属性(或方法)或没有ICommand的控件的事件,在这种情况下立即委托给演示者.
过了一会儿,我发现了MVVM模式,到目前为止它还没有找到我.据我所知,只有当我的模型不支持UI时,我才会使用MVVM.但是保持演示者并使用新模型更合理,我无法理解这种用法会让我失去什么.我知道我错过了什么,但它是什么:).
此外,当您的View是通用的并且可以处理多种模型时(例如在PropertyGrid中).建议将ViewModel与DataTemplate一起使用,但在这种情况下,您无法为模型中的每个实体创建模板,只需要在运行时进行调查,您会建议什么?
在观看Josh Smith在屏幕录像中谈论MVVM时,我感觉到ViewModel中模型的重新暴露违反了DRY(不要重复自己),这真的是不可避免的吗?令人惊讶的是,与ADO.Net动态数据元数据类的火焰相比,他现在没有人在争论它.
希望它足够清楚
谢谢
阿里尔
MVP VS MVVM有什么区别?为什么我们使用MVP,即使我们有三层:业务,数据访问和演示?是否有任何具体原因将Presentation层划分为MVP?
对于一个项目,我一直在研究JavaFX 2.0桌面应用程序(keytool UI).JavaFx2.0的工作方式(无论如何在我的项目中),UI事件处理发生在JavaFX 2.0 UI类本身中(例如:onclicked()事件或属性更改侦听器).
现在我使用一个带有方法的静态类:getController(),所有UI类都使用它来访问应用程序的一个控制器(不知何故,将控制器传递给所有50多个UI类似乎很麻烦).
然而问题是,一个控制器变得非常大!它有太多的方法(我的UI类需要访问所有业务逻辑方法).即使它只将方法调用传递给我的模型/服务,仍然需要在控制器级别捕获许多异常,以便在UI中处理它们(显示错误消息等).
任何人都知道一种简洁的方法可以使整个MVC/MVP模式更好地适用于我的应用程序,而UI/Controller/Model类不直接依赖于彼此吗?每个用例可能有不同的控制器?但是,我将如何制作它以便正确的UI类获得正确的控制器而不直接知道它?也许使用界面?
我执行上的Andorid应用MVP模式,我有一个关于哪里是疑问最好的地方用于检查网络连接. 在进行任何网络通话之前,我通常会检查是否有互联网连接.
那么,我应该在Activity或Presenter中查看它?我认为Presenter会是一个不错的地方,所以它决定要做什么,但是我不是百分之百确定如果我应该把它放在活动中并且避免打电话给Presenter.
我正在迈出第一步GWT.我看完之后有一个问题:
在第一个示例中,Presenter定义了接口View.
public class ContactsPresenter implements Presenter {
...
public interface Display extends HasValue<List<String>> {
HasClickHandlers getAddButton();
HasClickHandlers getDeleteButton();
HasClickHandlers getList();
void setData(List<String> data);
int getClickedRow(ClickEvent event);
List<Integer> getSelectedRows();
Widget asWidget();
}
}
Run Code Online (Sandbox Code Playgroud)
在第二个中,View定义了接口Presenter.
public interface ContactsView<T> {
public interface Presenter<T> {
void onAddButtonClicked();
void onDeleteButtonClicked();
void onItemClicked(T clickedItem);
void onItemSelected(T selectedItem);
}
void setPresenter(Presenter<T> presenter);
void setColumnDefinitions(List<ColumnDefinition<T>> columnDefinitions);
void setRowData(List<T> rowData);
Widget asWidget();
}
Run Code Online (Sandbox Code Playgroud)
这种差异的想法是什么? …
从我可以收集到的,前两个看起来并没有那么不同.无论它被称为控制器还是演示者,它似乎仍具有相同的中介功能.
MVVM似乎有点不同,因为控制器似乎更像是框架的一部分,例如XAML绑定.
什么是"悬崖笔记"对差异的解释?
我试图了解Model-View-Presenter和Model-View-Adapter模式之间是否存在差异,如果是这样,那么差异是什么.我没有找到任何比较/对比它们的在线资源,所以我甚至不确定它们是否真的是截然不同的.
我发现它们的描述听起来与我完全相同.从我收集的情况来看,在这两种情况下,控制流程基本上是:
View <-- Adapter/Presenter --> Model
(where Adapter/Presenter can also respond to events from View and Model)
View: the UI
Adapter/Presenter: main logic; mediator between the UI and the data model
Model: the data model
Run Code Online (Sandbox Code Playgroud)
Adapter/Presenter"知道"视图和模型,但视图和模型不了解除自己以外的任何人.
我希望这里有一个我完全不知道的微妙之处.它是什么?
我对使用Android上的MVP保存状态有些怀疑.我将片段/活动定义为视图,然后实现相应的演示者.
我的例子很简单:
我有一些带有复选框和微调器的活动.如果活动被Android系统销毁然后重新创建,我应该在哪里保存这些微调器和复选框状态?在视图?在主持人?
如果在视图上,我应该在视图上还是在演示者上有恢复逻辑?
谢谢!
在我的应用程序中,我使用ContentProvider和使用LoaderManager.LoaderCallbacks<Cursor>.
片段(查看)
public class ArticleCatalogFragment extends BaseFragment
implements ArticleCatalogPresenter.View,
LoaderManager.LoaderCallbacks<Cursor> {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return onCreateArticleCatalogLoader(args);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
data.registerContentObserver(new LoaderContentObserver(new Handler(), loader));
updateUI(data);
}
private Loader onCreateArticleCatalogLoader(Bundle args) {
int categoryId = args.getInt(CATEGORY_ID);
Loader loader = new ArticleCatalogLoader(this.getActivity(), categoryId);
return loader;
}
}
Run Code Online (Sandbox Code Playgroud)
从MVP的角度来看,我需要:
主持人
public class ArticleCatalogPresenter extends BasePresenter
implements LoaderManager.LoaderCallbacks<Cursor> {
View view;
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return onCreateArticleCatalogLoader(args); …Run Code Online (Sandbox Code Playgroud) 我正在为WinForms项目组装一个轻量级的MVP模式.一切都编译好,运行良好.但是,当我尝试在Visual Studio中以设计模式打开WinForm时,出现" 路径中的非法字符 "错误.我的WinForm使用泛型并从基类Form类继承.在WinForm中使用泛型是否有问题?
这是WinForm和基本Form类.
public partial class TapsForm : MvpForm<TapsPresenter, TapsFormModel>, ITapsView
{
public TapsForm()
{
InitializeComponent();
}
public TapsForm(TapsPresenter presenter)
:base(presenter)
{
InitializeComponent();
UpdateModel();
}
public IList<Taps> Taps
{
set { gridTaps.DataSource = value; }
}
private void UpdateModel()
{
Model.RideId = Int32.Parse(cboRide.Text);
Model.Latitude = Double.Parse(txtLatitude.Text);
Model.Longitude = Double.Parse(txtLongitude.Text);
}
}
Run Code Online (Sandbox Code Playgroud)
基本形式MvpForm:
public class MvpForm<TPresenter, TModel> : Form, IView
where TPresenter : class, IPresenter
where TModel : class, new()
{
private readonly TPresenter presenter;
private TModel model;
public …Run Code Online (Sandbox Code Playgroud)