除了单元测试的好处,我听到的关于MVP模式的是表示层的可重用性.因此,您将设计一个表示层并将其用于WinForms(丰富)和Web.
我目前正在研究.NET中的Windows窗体应用程序,可能会在将来创建Web UI.但是,当我设计表示层和UI层之间的交互时,我不确定这种可重用性的概念是否值得所有麻烦.我有时觉得自己正在为可能的Web UI"减少"我的演示文稿,当它专门为windows窗体UI设计时可以更多.
那么,有多少人正在获得可重用表示层的好处?在现实世界中,这种可重用性是否会成功?
可能的重复:
什么是MVP和MVC,有什么区别?
mvc和mvp模式
伙计们,
使用MVC而不是MVP有哪些好处?我喜欢我不必使用MVP框架,可以通过接口和类实现.我仍然将MVC所关注的问题分开,并进行单元测试.使用MVC而不是MVP有什么好处?
你如何对待MVP模式中的适配器?例如,在这个项目https://github.com/msahakyan/nested-recycler-view中 有一个MovieAdapter, https://github.com/msahakyan/nested-recycler-view/blob/master/app/src/ main/java/com/android/msahakyan/nestedrecycler/adapter/MovieAdapter.java这个家伙有一个recyclierview作为这个适配器中的项目,(如果你看看他的项目,他已经在他的主屏幕上嵌套了recyclierview.)因为他有这样的一个项目,他进行服务调用和其他通知,加载数据(从服务中取出)等操作在这个适配器中.(没有通信到相关的片段/活动)正如你所看到的,这个适配器有很多工作要做.如果你这样做,你将如何在mvp模式中实现这一点?具体来说,在这种情况下,您是否在适配器中有presenter对象,或者有视图对象来执行调用,通知和加载?
我试图在MVP模式中实现一种将View和Presenter分离的方法,以提供一个框架,这正是这样做的,但在一点之后我感到困惑.
我有一个View接口,其中包含连接的演示者的泛型类型,反之亦然.这些接口将由实现开发人员扩展.具体的界面对这个问题不感兴趣,但这些界面的类定义如下所示:
public interface Presenter<T extends View>
Run Code Online (Sandbox Code Playgroud)
和
public interface View<T extends Presenter>
Run Code Online (Sandbox Code Playgroud)
这个想法是View和Presenter都知道对立的界面.
对于使用此结构,开发人员应提供工厂,实例化他想要显示的视图和处理此视图的Presenter.他把它们都给了一个名为SuperController的类.它们与View的类相关联.
创建Presenter的PresenterFactory接口没有参数,并返回Presenter实现,并查看以下内容:
public interface PresenterFactory<T extends View> {
<S extends Presenter<T>> S create();
}
Run Code Online (Sandbox Code Playgroud)
创建View的ViewFactory接口基于Presenter创建View实现,并查看以下内容:
public interface ViewFactory<T extends View, S extends Presenter<T>> {
T create(S presenter);
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题如下:
我想提供一个TestView和TestPresenter的示例.那些看起来像这样:
public interface TestPresenter extends Presenter<TestView> {...}
public interface TestView extends View<TestPresenter> {...}
Run Code Online (Sandbox Code Playgroud)
此外,还提供了ViewFactory,如下所示:
class TestViewFactory implements ViewFactory<TestView, TestPresenter> {
@Override
public TestView create(TestPresenter presenter) {
return new TestViewImpl(presenter);
}
}
Run Code Online (Sandbox Code Playgroud)
这是TestPresenterFactory:
private class TestPresenterFactory …Run Code Online (Sandbox Code Playgroud) 请注意,我不是要求选择哪个(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) 更新1-13-10 我已经能够使用下面的代码找到一些成功的映射.我基本上忽略了没有映射的任何属性,然后映射它们.我希望得到关于我是否以最佳方式进行此项讨论的反馈意见.另外,我不知道如何进行单元测试这种映射.我的印象是使用AutoMapper应该有助于减轻检查每个属性的繁琐.
这是我的新代码:
Mapper.CreateMap<MoveEntity, MoveEntityDto>()
.ForMember(dest => dest.PrimaryOriginTransferee, opt => opt.Ignore())
.ForMember(dest => dest.PrimaryDestinationTransferee, opt => opt.Ignore())
.ForMember(dest => dest.Customer, opt => opt.Ignore())
.ForMember(dest => dest.DestinationAddress, opt => opt.Ignore())
.ForMember(dest => dest.OriginAddress, opt => opt.Ignore())
.ForMember(dest => dest.Order, opt => opt.Ignore())
.ForMember(dest => dest.Shipment, opt => opt.Ignore())
.ForMember(dest => dest.SourceSystemName, opt => opt.Ignore());
Mapper.CreateMap<ContactEntity, TransfereeEntityDto>();
Mapper.CreateMap<CustomerEntity, CustomerEntityDto>();
Mapper.CreateMap<AddressEntity, AddressEntityDto>();
Mapper.CreateMap<OrderEntity, OrderEntityDto>()
.ForMember(dest => dest.OrderForwarding, opt => opt.Ignore())
.ForMember(dest => dest.Forwarder, opt => opt.Ignore());
Mapper.CreateMap<ShipmentEntity, ShipmentEntityDto>()
.ForMember(dest => dest.Services, opt => …Run Code Online (Sandbox Code Playgroud) 我按照此处给出的示例使用我的GWT应用程序中的MVP模式http://code.google.com/webtoolkit/doc/latest/tutorial/mvp-architecture.html
我为MainView中的每个面板都有一个MainPresenter和sub-presenter.为了展示一个新的子演示者,我做了这样的事情:
presenter = new PresenterA(new ViewA(), ....);
presenter.go(panel) // presenter clears the panel and itself to the panel
Run Code Online (Sandbox Code Playgroud)
何时PresenterA创建,它将自己绑定到事件中ViewA.我的问题是,切换到新演示者的正确方法是什么?现在,我只是创建一个新的演示者并将其附加到同一个面板,如下所示:
presenter = new PresenterB(new ViewB(), ....);
presenter.go(panel) // presenter clears the panel and itself to the panel
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
android ×3
c# ×2
java ×2
.net ×1
architecture ×1
asp.net-mvc ×1
automapper ×1
generics ×1
gwt ×1
javascript ×1
memory-leaks ×1
model ×1
presentation ×1
reusability ×1
structuremap ×1
view ×1