我在c#和asp.net中实现MVP模式时遇到了问题

本文关键字:模式 遇到 问题 MVP 实现 asp net 我在 | 更新日期: 2023-09-27 18:07:58

我已经创建了MVP模式的论坛系统,但我不确定我是否以正确的方式实现了它。这就是我最后写的:

  • 我已经创建了一个数据库,其中有三个表:论坛,线程,帖子
  • 为项目添加了一个新的类型数据集,然后将所有的表拖入其中
  • 创建了三个新类:ForumsModel, ThreadsModel, PostsModel
  • 新增IForumView、IThreadView、IPostView三个接口
  • 三个类:ForumsPresenter, ThreadsPresenter, PostsPresenter

在模型类中我只调用类型化数据集方法在演示器中我调用了模型方法。视图是.aspx页面。这是所有的论坛系统,但这里是棘手的部分:

因为MVP模式是一个UI模式,我必须在应用程序本身做数据的验证。所以我的设计MVP是应用程序!

我做错了什么?

编辑1:首先关于为什么我选择类型化数据集与存储过程在其他选项:它是最轻的数据提供程序,不会损害任何架构你有。其他的选择是直接sql,这对于新创建的应用程序来说不是一个好的选择,LINQ to sql类太重了,不能在每个请求中实例化,实体框架很好,但对于这样一个简单的任务来说太多了!至少如果我要创建一个博客引擎,它会是我的第一选择。至于为什么我没有选择MVC,这是因为我认为MVP是更好的模式,因为它会给我完全分离我的应用程序的不同部分。最后,这是一个问题,但你应该能够实现任何模式,对吗?我见过不同风格的MVP,但我想实现的是这个:

model<------------->presenter<-------------->view

databind选项是用于表示模型模式,据我所知是由martin fawler介绍的,但我正在尝试创建的是微软版本,基本上是PM模式的扩展版本。

两天前我问了一个关于数据验证的问题,有人建议我应该在"应用程序本身"中进行验证,所以当我问这个"应用程序"在哪里时,他说MVP是一个UI模式,它不应该是你的"应用程序",你应该在你的用户界面层实现MVP。这就是我一开始问这个问题的原因!

我在c#和asp.net中实现MVP模式时遇到了问题

使用MVP,后面的代码成为基于视图接口的视图实现。

View接口包含演示者需要绑定到的页面事件,以便更改视图的状态,以及可能需要的属性和方法。例如,它可以挂钩onLoad事件,并调用到视图来改变它的状态。在这样做时,它对视图实现是不可知的,并且对控件一无所知。这意味着您可以编写单元测试而不需要ASPX实例。

要创建一个自动连接的MVP引擎,您将使用基本页面、泛型和IoC。IoC允许你为WebContextBase这样的东西设置依赖覆盖,它只对那个请求管道可见,并且可以传递给你的Presenter构造函数。

IoC还允许你将其他依赖项注入到演示器中,以帮助保持轻量级。通过这种方式,您可以将业务和数据访问转移到其他层。

MVP是非常有用的,当你使用WebForms,如大多数CMS系统。如果您不受约束,那么使用MVC。Net用于新web开发。

更新:正如所承诺的,这里有一个相当不错的例子。它缺少的是依赖覆盖,可以这样做:

var dependencies = new DependencyOverrides
                    {
                        {typeof (HttpRequestBase),new HttpRequestWrapper(Request)},
                        {typeof (HttpResponseBase),new HttpResponseWrapper(Response)},
                        {typeof (IPrincipal),Context.User},
                        {typeof (IIdentity),Context.User.Identity},
                        {typeof (IUserProfile),Context.User.Profile},
                        {typeof (HttpSessionStateBase),new HttpSessionStateWrapper(Session)}
                    };
presenter = container.Resolve<TPresenter>(dependencies);

您选择webforms而不是ASP,这是架构上的错误。。NET MVC框架。此外,类型数据集是2003年的,你应该使用实体框架。跟上时代!

你看过ASP吗?净MVC吗?它是模型-视图-控制器模式,将为您处理所有的路由和管道。您可以使用DataAnnotations轻松地进行模型验证,这里有大量的参考资料和教程

或者有一个特定的原因,为什么你需要使用经典ASP.NET的MVP模式?

既然你的问题不是关于MVC vs MVP或类型化数据集vs实体框架的优点,我假设你有一个令人信服的理由去做你正在做的事情。

有了这些,你似乎没有做错什么。对于MVP,验证应该在Presenter实现中进行,因为它们在回发期间可以访问视图实例。当然,你也可以使用javascript的客户端验证。