请注意,我不是要求选择哪个(MVC或MVP),而是应该将其中一个用于Web应用程序.
我意识到将旧应用程序从其当前设计转换为MVC或MVP模式可能需要做太多工作.但是,对于一个新的应用程序呢?看来这些是最流行的架构模式,那么应该选择其中一种吗?如果没有,还有其他什么模式?
如果你不熟悉MVC和/或MVP,那么一个很好的问题就是"什么是MVP和MVC,有什么区别?" .它有很多很好的答案,包括各个网站的链接,每个网站都打破了每个网站.
architecture model-view-controller mvp design-patterns web-applications
我已经实现了我自己的模型视图演示者模式的副本(在Web客户端软件工厂的静脉中),所以我可以利用我自己的DI框架而不是绑定到WCSF的ObjectBuilder,我遇到了很多问题.我想出了几个方法来做到这一点,但没有一个特别让我开心.我想知道是否有其他人有其他想法.
使用HttpModule拦截context.PreRequestHandlerExecute来调用ObjectFactory.BuildUp(HttpContext.Current.Handler)
public partial class _Default : Page, IEmployeeView
{
private EmployeePresenter _presenter;
private EmployeePresenter Presenter
{
set
{
_presenter = value;
_presenter.View = this;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在页面加载中调用buildup而不是使用HttpModule
public partial class _Default : Page, IEmployeeView
{
private EmployeePresenter _presenter;
private EmployeePresenter Presenter
{
set
{
_presenter = value;
_presenter.View = this;
}
}
protected void Page_Load(object sender, EventArgs e)
{
ObjectFactory.BuildUp(this);
}
}
Run Code Online (Sandbox Code Playgroud)
如果需要,通过Property访问presenter允许Getter to BuildUp.
public partial class _Default : Page, IEmployeeView
{
private EmployeePresenter …Run Code Online (Sandbox Code Playgroud) 关于在GWT应用程序中的使用,你们中的任何人都可以对MVP模式做出很好的解释.我看过的任何一个例子,我发现很难理解实现模式的概念.
这样的问题是什么?它实现了什么,如何实现以及如何扩展以便将来进行修改?
在半年的Winforms-MVP中,我设计了以下异常处理策略.我有一个基本的抽象Presenter类,其中有几个Execute方法将一个委托作为输入参数(签名各不相同).View和Presenter之间的交互是通过IView中定义的事件(输入)完成的,并通过设置公共属性(输出)或调用IView中定义的方法并由View实现.演示者中的每个事件处理程序都会调用其中一个Execute方法,为其提供具体的实现.
在execute方法中,我有几个catch块,用于可能发生的非常明确的异常(主要是因为广泛使用的外部组件中的一些问题).这些异常中的每一个都会停止执行当前操作,通过调用View的方法记录并向用户显示有意义的解释.
不久前(事实上很久以前)我开始学习WPF-MVVM,乍一看似乎与MVP有很多共同之处.我正在寻找关于那里的异常处理策略的一些方便的建议(主要告知用户有关问题),但这个问题一般难以搜索 - 我的意思是说,但主要是原则上.我已经在app.xaml.cs中找到了20多个"处理"未处理异常的例子,这一切都非常好,但请真诚地告诉我 - 如果你知道可能导致应用程序崩溃的确切异常,你不会处理它们吗?稍早一点(即使你将被迫关闭你的应用程序)?我不喜欢抓住所有可能的异常.应该在不关闭应用程序的情况下处理由网络问题,临时数据库不可用等引起的大量异常,而不会出现可怕的错误图标,从而使普通用户有机会重复他的请求.
因此,作为一个实验,我尝试了几乎与之前描述的相同的事情 - 我在ViewModel中创建了事件,用于异常转换和订阅View.但是,坦率地说,这种方式让我感到毛骨悚然.
(这是一个非常长的演讲,我知道)问题:在使用MVVM时,如何处理有关通知用户的异常?不,我现在对数据验证不感兴趣.任何关于MVP的批评和/或建议也是受欢迎的.
我打算用Winform构建应用程序,我想使用MVP模式.
由于我之前从未使用过MVP模式,因此我不确定如何构建新项目.
我应该使用与ASP.NET MVC中相同的约定,例如在项目中为模型,演示者和视图创建单独的文件夹,然后可以使用Presenter类的命名约定,以便它们的名称以"Presenter"结尾(与名称相同) MVC中的控制器以"Controller"结束
或者我应该为Presenter和Model创建单独的项目吗?
在RecyclerView中,我有一个ViewHolder带有VideoView和Button"Like"的状态(选择与否).
我的Presenter有一个方法可以更新模型中的"Like"状态 - VideoEntity.在回调中我需要更新View form Presenter,所以我打电话getView().updateItem(VideoEntity entity).之后,我应该找到recyclerView实体位置,并使项目无效.所以我想避免这种情况.
在经典架构中,我可以调用一些方法ViewHolder,在那里获得一些回调并更新已更改的数据.
如何将此伪代码迁移到MVP模式?
@Override
public void onBindViewHolder(ContainerViewHolder holder, int position) {
...
rx.subscribe(result -> holder.update(result));
}
@Override
public void onViewRecycled(ContainerViewHolder holder) {
if (haveBackgroundRequests) { rx.unsubscribe(holder); }
}
Run Code Online (Sandbox Code Playgroud) 我是android开发的新手.我想在我的项目中实现MVP,但我不知道使用MVP的优点是什么请告诉我在Android中使用MVP有什么好处.
我有Recycler Viewer,它显示来自Fire Base db的数据,但是初始List包含大约4k个元素.我试图只显示前15个元素,而不是等待加载完整列表,但不知道如何做到这一点.
我试图通过Subscriber获取(x)元素但是它不会提高读取性能(它仍然等待来自Firebase DB的4k元素).如何加快这个?
@Override
public void onBindViewHolder(final ListContentFragment.ViewHolder holder, int position) {
modelInterface.getDataFromFireBase("FinalSymbols")
.take(15)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<DataSnapshot>() {
@Override
public void accept(DataSnapshot dataFromDb) throws Exception {
//update TextView inside Recycler Viewer
holder.name.setText(dataFromDb.child(String.valueOf(holder.getAdapterPosition())).child("description").getValue().toString());
holder.description.setText(dataFromDb.child(String.valueOf(holder.getAdapterPosition())).child("categoryName").getValue().toString());
}
}
);
}
Run Code Online (Sandbox Code Playgroud)
@Override
public Flowable<DataSnapshot> getDataFromFireBase(final String childName) {
return Flowable.create(new FlowableOnSubscribe<DataSnapshot>() {
@Override
public void subscribe(final FlowableEmitter<DataSnapshot> e) throws Exception {
databaseReference.child(childName).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
e.onNext(dataSnapshot);
e.onComplete();
}
@Override …Run Code Online (Sandbox Code Playgroud) mvp observable firebase recycler-adapter firebase-realtime-database
假设我有一个具有 3 个状态的元素:state1, state2, state3。最基本的流程是:
state1 -> state2 -> state3 -> state1 -> ... 等等
单击按钮时状态会更改。我实现了状态机设计模式来管理这些状态。
当然,当状态发生变化时,布局和逻辑层中的某些事情也会发生变化。问题是,我想知道 MVP 实现在这些状态更改后会是什么样子。视图更改逻辑应该放在哪里,模型更改逻辑应该放在哪里。一个基本的例子会很棒。
这是我的代码:
MainActivity.java:
StateContext stateContext;
@OnClick(R.id.button_change_state)
public void onClickChangeStateButton(View view) {
stateContext.takeAction();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
stateContext = new StateContext();
}
Run Code Online (Sandbox Code Playgroud)
StateContext.java:
public class StateContext {
private State state;
public StateContext() {
this.state = new State1();
}
public void setState(final State state) {
this.state = state;
}
public void takeAction() …Run Code Online (Sandbox Code Playgroud) 我正在尝试按照 android 蓝图指南将 MVP 模式实施到我的项目中。目前,我在 Presenter 中保存用户(实体数据),我真的不喜欢它,因为在每次配置更改时,Presenter 都会从数据库中获取用户。
我的第一个问题是:
我也知道 android 架构组件,尤其是 ViewModel,但是,我想保留 MVP 模式而不是 MVVM。
我的第二个问题是:
我已经被这个问题困住了很长一段时间,很想最终解决它。
干杯
mvp ×10
android ×4
c# ×3
winforms ×2
.net ×1
adapter ×1
architecture ×1
firebase ×1
gwt ×1
java ×1
mvvm ×1
observable ×1
structuremap ×1
wpf ×1