请注意,我不是要求选择哪个(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) 视图是否在其接口中没有任何特定于事件的事件,并调用presenter普通方法来处理事件而没有任何正式的EventHandlers?例如
// ASPX
protected void OnSaveButtonClicked(object sender, EventArgs e)
{
_Presenter.OnSave();
}
Run Code Online (Sandbox Code Playgroud)
或者视图是否在其接口中定义了事件EventHandler,并将这些事件明确地链接到控制页面上的事件
// View
public interface IView
{
...
event EventHandler Saved;
...
}
// ASPX Page implementing the view
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
SaveButton.Click += delegate { Saved(this, e); };
}
// Presenter
internal Presenter(IView view,IRepository repository)
{
_view = view;
_repository = repository;
view.Saved += Save;
}
Run Code Online (Sandbox Code Playgroud)
第二个似乎是一大堆管道代码全部添加.
我的目的是了解每种风格的好处,而不仅仅是一个可以使用的一揽子答案.我的主要目标是清晰度和高价值可测试性.整体可测试性很重要,但我不会牺牲设计的简洁性和清晰度,以便能够添加另一种类型的测试,这种测试不会导致通过更简单的设计实现的测试案例获得太多的收益.如果一个设计选择没有更多可测试性,请包括它现在可以提供的测试类型的示例(伪代码很好),所以如果我足够重视那种类型的额外测试,我可以做出决定.谢谢!
更新:我的问题是否需要进一步澄清?
关于在GWT应用程序中的使用,你们中的任何人都可以对MVP模式做出很好的解释.我看过的任何一个例子,我发现很难理解实现模式的概念.
这样的问题是什么?它实现了什么,如何实现以及如何扩展以便将来进行修改?
我是新手使用MVP模式,我只是想确保从用户控件中调用演示者的最佳方式.
MyPage.aspx有一个演示者MyPresenter
该页面包含一个用户控件,它通过我从MyPage设置的属性接受MyPage的Presenter
MyUserControl.Presenter = this.Presenter
Run Code Online (Sandbox Code Playgroud)
我现在正试图在演示者中调用Method1,它会检索一些配置并在用户控件的视图上设置它.
Presenter.Method1(); // calls method and sets config to the view
Run Code Online (Sandbox Code Playgroud)
我的问题首先是
如果是这样,通过用户控件访问视图值是否有效,如下所示.
Presenter.View.MyData
我只是想确保我不会走这条完全错误的道路!
在半年的Winforms-MVP中,我设计了以下异常处理策略.我有一个基本的抽象Presenter类,其中有几个Execute方法将一个委托作为输入参数(签名各不相同).View和Presenter之间的交互是通过IView中定义的事件(输入)完成的,并通过设置公共属性(输出)或调用IView中定义的方法并由View实现.演示者中的每个事件处理程序都会调用其中一个Execute方法,为其提供具体的实现.
在execute方法中,我有几个catch块,用于可能发生的非常明确的异常(主要是因为广泛使用的外部组件中的一些问题).这些异常中的每一个都会停止执行当前操作,通过调用View的方法记录并向用户显示有意义的解释.
不久前(事实上很久以前)我开始学习WPF-MVVM,乍一看似乎与MVP有很多共同之处.我正在寻找关于那里的异常处理策略的一些方便的建议(主要告知用户有关问题),但这个问题一般难以搜索 - 我的意思是说,但主要是原则上.我已经在app.xaml.cs中找到了20多个"处理"未处理异常的例子,这一切都非常好,但请真诚地告诉我 - 如果你知道可能导致应用程序崩溃的确切异常,你不会处理它们吗?稍早一点(即使你将被迫关闭你的应用程序)?我不喜欢抓住所有可能的异常.应该在不关闭应用程序的情况下处理由网络问题,临时数据库不可用等引起的大量异常,而不会出现可怕的错误图标,从而使普通用户有机会重复他的请求.
因此,作为一个实验,我尝试了几乎与之前描述的相同的事情 - 我在ViewModel中创建了事件,用于异常转换和订阅View.但是,坦率地说,这种方式让我感到毛骨悚然.
(这是一个非常长的演讲,我知道)问题:在使用MVVM时,如何处理有关通知用户的异常?不,我现在对数据验证不感兴趣.任何关于MVP的批评和/或建议也是受欢迎的.
我正在使用Winforms,CAB,C#和Infragistics.我正在尝试使用与WCF连接的后端使用MVP.
在我的演示者中,我有我的模型,我们称之为AgreementDataContract.此数据协定有许多属性:
...
[DataMember]
public byte[] PVImage { get; set; }
[DataMember]
public byte[] OntwerpImage { get; set; }
[DataMember]
public Decimal WattpiekPrijs { get; set; }
...
Run Code Online (Sandbox Code Playgroud)
您会注意到Image存储为byte [].我将这些属性绑定到我的用户控件上的控件:
BindingHelper.BindField(_ultraPictureBoxPV, "Image", _bindingSource, "PVImage");
BindingHelper.BindField(_ultraPictureBoxOntwerp, "Image", _bindingSource, "OntwerpImage");
Run Code Online (Sandbox Code Playgroud)
BindingHelper只是将BindingContext添加到指定的Controler(control.BindingContext.Add(...)).
无论如何,问题是:数据契约包含图像作为bytearray,而我绑定到图像.这会导致属性保持为"null",因为他不想将一个Image放在byteArray中;)
我试过玩它,但我想我有两种可能性:
我可以尝试使用某种转换器吗?因此,当插入Image时,它将作为byteArray而不是Image传递给Model(=数据绑定).
我可以删除绑定并在表单"提交"时创建一个事件,并将图像转换为byteArray并填写模型.(=没有数据绑定)
TL; DR; 您是否知道在将图像传递给数据绑定时将图像"转换"为bytearray的方法?
我希望我的问题很明确!谢谢您的帮助
我正在将我的应用程序迁移到MVP.已经从这个konmik上获得了静态演示者模式的提示
这是我简短的MVP策略.为简洁起见,删除了大部分样板和MVP监听器.这个策略帮助我定位变更证明我的后台流程.与完成活动的暂停相比,活动正常恢复正常暂停.此外,Presenter只有应用程序上下文,因此它不会保留活动上下文.
我不是一名java专家,这是我第一次涉足MVP并使用静态演示者让我感到不舒服.我错过了什么吗?我的应用程序工作正常,响应速度更快.
视图
public class MainActivity extends Activity{
private static Presenter presenter;
protected void onResume() {
if (presenter == null)
presenter = new Presenter(this.getApplicationContext());
presenter.onSetView(this);
presenter.onResume();
}
protected void onPause() {
presenter.onSetView(null);
if(isFinishing())presenter.onPause();
}
}
Run Code Online (Sandbox Code Playgroud)
主持人
public class Presenter {
private MainActivity view;
Context context;
public Model model;
public Presenter(Context context) {
this.context = context;
model = new Model(context);
}
public void onSetView(MainActivity view) {
this.view = view;
}
public void onResume(){
model.resume();
}
public void onPause(){ …Run Code Online (Sandbox Code Playgroud) 我已经看过很多项目,展示了如何在MVP中实现登录,但找不到与Google/Facebook登录相关的任何内容.
在登录流程强烈绑定到Android组件生命周期的情况下,我们该怎么办?我看到MVP的主要好处在于我们建立上述的抽象Context,但是当我们需要遵循,例如,Facebook的登录流程这种抽象会显得过于复杂:你需要注册FacebookCallback与CallbackManager,调用logInWithReadPermissions()(传递活动/片段吧)委派onActivityResult()到callbackManager,这将触发FacebookCallback的方法.
我的想法是创造类似的东西
interface AuthInteractor {
void doFacebookLogin();
void doGoogleLogin();
}
Run Code Online (Sandbox Code Playgroud)
其实现将了解Context并初始化GoogleApiClient.它会在Presenter中注入,但是所有这些回调(特别是在Facebook的SDK中)会变得太复杂.在这种情况下省略MVP不是更好吗?
我是android开发的新手.我想在我的项目中实现MVP,但我不知道使用MVP的优点是什么请告诉我在Android中使用MVP有什么好处.
mvp ×10
c# ×4
android ×3
asp.net ×2
webforms ×2
architecture ×1
data-binding ×1
gwt ×1
infragistics ×1
java ×1
mvvm ×1
structuremap ×1
tdd ×1
winforms ×1
wpf ×1