我正在编写我的第一个应用程序,使用ASP.NET MVP(尝试监督控制器)和单元测试(迟到总比没有好!),我遇到了一个两难的境地.我写了3个用户控件,所有测试和界面,主持人.现在我来到一个采用这三个用户控件的页面,遇到了以下问题:
用户控件1是DateSelector,它是一个带有其他几个按钮/列表的Calendar控件.没什么真正令人兴奋的
用户控件2是DailyList.猜猜它是什么.无论如何,你可以选择/删除等.如果你从gridview中选择一个项目,它需要填充用户控件3.
用户控件3是ItemDetail.下面是DropDownLists,TextBoxes等...其中一些与其他人存在依赖关系(在DropDown中选择一个选项会影响DropDown 2中的选项).
如果我从DateSelector中选择一个新日期,我是否从DateSelector Presenter中引发事件?我必须以某种方式让其他用户控件知道选择了一个新日期,以便他们可以重新绑定他们的数据,但是如何?如果我使用Page的Presenter订阅用户控件视图的演示者,我是不是会公然违反Demeter法则(通过他们的视图将演示者公开为属性)?我不能使用Page的Presenter作为页面的全知控制器吗?有什么我想念的吗?
到目前为止,我所阅读的所有内容都表示,"即使使用用户控件,MVP也很棒",但在使用示例时,用户控件的使用很容易被遗忘.在我看来,MVC将更加贴近我对此的思考模式,但目前,MVC不是一种选择.任何帮助都会很棒.提前致谢.
我开始在谷歌上通过示例学习GWT ,我的第一个结论是:代码太多了
像这样:
stocks.add(symbol);
stocksFlexTable.setText(row, 0, symbol);
stocksFlexTable.setWidget(row, 2, new Label());
stocksFlexTable.getCellFormatter().addStyleName(row, 1,
"watchListNumericColumn");
stocksFlexTable.getCellFormatter().addStyleName(row, 2,
"watchListNumericColumn");
stocksFlexTable.getCellFormatter().addStyleName(row, 3,
"watchListRemoveColumn");
Run Code Online (Sandbox Code Playgroud)
GWT是否有任何扩展来减少代码大小和简化创建GWT表单?
使用MVP,您通常将视图(UI)与Presenter中的Presenter绑定.但是使用最新版本的GWT,特别是使用UIBinding,您可以在视图中执行以下操作:
@UiHandler("loginButton")
void onAboutClicked(ClickEvent event)
{
// my login code
}
Run Code Online (Sandbox Code Playgroud)
这基本上为一些快速注释代码交换了许多匿名内部类代码.非常好!!问题是此代码在视图中而不是演示者...
所以我想也许:
@UiHandler("loginButton")
void onAboutClicked(ClickEvent event)
{
myPresenter.onAboutClicked(...);
}
Run Code Online (Sandbox Code Playgroud)
但是这种方法存在一些问题.最重要的是,您可以模糊View和Presenter之间的界限.谁做了绑定,在某些情况下它是视图,在其他情况下它是演示者(绑定到不在当前视图中但需要附加的事件 - 例如系统范围的更新事件).
您仍然可以获得能够对演示者进行单元测试的好处,但需要付出多少代价.责任现在很混乱.例如,绑定有时在"视图"中,其他时间在"演示者"级别中.随着时间的推移,我可以看到代码陷入各种混乱状态.
我还考虑将Presenter扩展到View,以便您可以在View中执行此操作.这里的问题是你失去了Presenter运行标准单元测试的能力!这是一个重大问题.这和线条再次变得模糊.
所以我的问题是,有没有人有一个很好的方法来利用MVP模式中UIBinding的注释,而不会模糊线条并失去MVP模式的优势?
我最近一直在研究GWT和MVP,说实话我很困惑.我的项目将包括大约40个不同的地方或观点.在阅读多个教程时,有些人遵循模型 - 视图 - 演示者,其他人使用活动和地点,所有这些都在MVP,GWT的主题下.
我不确定要为新的MVP GWT 2.2项目做些什么.
非常感谢,Alex
我有一个简单的应用程序,并希望使其可测试.我是这个领域的新人.这是一个简单的Presenter,请记住这段代码,你能建议或给我一些如何测试它的例子.
public class SomePresenter extends Presenter<MainPanelPresenter.Display>
{
public interface Display extends WidgetDisplay
{
HasClickHandlers getAddButton();
HasClickHandlers getDeleteButton();
void setData(ArrayList<Person> data);
ArrayList<String> getSelectedRows();
Widget asWidget();
}
private final DispatchAsync dispatcher;
public static final Place PLACE = new Place("main");
@Inject
public SomePresenter(DispatchAsync dispatcher, EventBus eventBus, Display display)
{
super(display, eventBus);
this.dispatcher = dispatcher;
bind();
}
protected void onBind()
{
display.getAddButton().addClickHandler(new ClickHandler()
{
public void onClick(ClickEvent event)
{
eventBus.fireEvent(new AddButtonEvent());
}
});
display.getDeleteButton().addClickHandler(new ClickHandler()
{
public void onClick(ClickEvent event)
{
ArrayList<String> list = …Run Code Online (Sandbox Code Playgroud) 每个Android Developer都面临着一个问题,即活动或碎片很复杂,因为大多数应用程序只使用View-Model设计.和我一样,所以我开始寻找更好的解决方案.
引起我注意的是MVP,它是旧设计,但一次又一次地重生.
我假设我们可以用这种方式创建应用程序:
片段和活动是View的一部分.它们与Presenter连接,Presenter调用DataManager来加载内容.DataManager作为Model的一部分引用了每个数据助手.但是在这里DataManager在我们的应用程序中开始成为上帝,因为它为每个Presenter提供了所有方法.
我还发现了第二个可能的问题.演示者可以在列表中保存数据,因此每次我们更改屏幕的方向时,我们都不必为新内容调用DataManager.但是不知道如何实现该演示者与Activity生命周期无关,除了在我们的Activity中有静态字段.
总结一下:
1.以某种方式创建多个DataManage并且当一个DataManager开始过载时,它会更好吗?实现多个DataManagers的最佳方法是什么?
2.如何实现Presenter与View之间的关系,其中Presenter与Activity生命周期无关?
我可能会误解一些想法,所以每一个帮助都会受到赞赏.
编辑
这显示了MVP究竟应该如何看待imho
编辑2
由于帖子被指定为过于宽泛,我只想问
1.将DataManager作为上帝类或者我应该实现多个DataManagers是好的模式吗?如果是这样,最好的方法是什么?
我正在使用MVP模式构建一个小型测试Android应用程序.我有两个片段片段B(我用于滑动抽屉)和片段A(主片段).这两个片段都有自己的演示者.当我点击滑动绘制时,它应该发送消息或调用片段A中的方法来更新视图.我想问一下,两位片段主持人如何在MVP下进行交谈.我知道其他解决方案,但我想通过MVP模式来实现.
请建议MVP模式遵循的一些选项来处理此类场景.
我是RxJava的新手,并将其与MVP架构结合使用.
我发现了一些关于使用保留片段在配置更改时保存observable的示例(仍然不确定这是否是最好的方法).我发现的例子是直接在Activity或Fragment上处理observable,而不是从Presenter处理.
所以我试验并设置了这个快速示例(仅使用Reactivex的RxJava和RxAndroid lib)来测试,这似乎工作正常.这个例子的作用是:
我想知道我是否正确地执行此操作,并且当在Presenter中处理observable的订阅时,是否有更高效或更优雅的方式来处理配置更改?
编辑:感谢您的反馈.基于此,我已经达到了我认为更清洁的解决方案,并且我已经更新了我的链接示例.
随着新的变化; 而不是将Observable从Presenter传递给Activity到retainFragment以存储一个configurationChange事件,我宁愿将retainFragment设置为Presenter创建时的第二个"视图".
这种方式当onResume()在设备旋转后发生时,我不需要让Activity执行将Observable从retainFragment传递回Presenter的丑陋管道.
Presenter可以直接与第二个"视图"进行交互,并检查保留的observable本身并在需要时重新订阅.主要活动不再需要知道这个可观察的.突然间,这是一个更简单的视图层.
首先,我知道使用Model View Presenter有不同的实现,在我看来,只要你清楚地定义了抽象层并完成了他们指定的角色,那么你如何实现这种模式是开放的解释.我在很多只有一个应用程序的应用程序中实现了这种模式Activity.我现在已经开始了一个具有多个活动并附加的新项目Fragments,包括嵌套片段(ViewPager).
我现在正试图将MVP翻译成这个项目,我已经打了一个概念墙,想要一些指导和见解.
到目前为止,我已经创建了上述结构,开始做一个1:查看&主讲人(不管1的关系Activity或Fragment).我觉得这没关系,但是例如我发送了一个请求从ActivityView向其Presenter 做了一些事情,它将结果返回到ActivityView我将如何传播结果,即更新所有其他活动/片段目前不在Paused()或Stop()州.我觉得在这种情况下应该有一个中央Presenter更新所有必要的Activity和Fragment Views,但我不知道如何去做.
目前,当每个Activity和Fragment创建它时,它创建一个Presenter类的新实例,将其自身作为引用传递(活动和片段实现它们自己的接口),演示者将其存储为a,WeakReference并在返回结果时调用相关的接口方法.
根据文档,每当Fragments想要彼此通信和附加时,Activity您应该使用回调接口.考虑到这一点,我应该有一个回调接口,该活动器具和Fragments回调时,他们要求的东西,所以在本质上只是活动将有一个片段具有回调,以便使各种请求演示和模型层?
对不起,如果这听起来有点混乱,希望这足以清楚地了解我想要达到的目标,如果我正在思考正确的方向......或者完全不合适!
mvp android design-patterns android-fragments android-activity