NBearV3教程——MVP(Model/View/Presenter)篇

超详细教程:YOLO_V3(yolov3)训练自己的数据 前言:最近刚好做一个项目需要做detection,选择的算法是yolo v3,因为它既有速度又有精度,还非常灵活,简直是工业界良心。做项目免不了需要用到自己的数据集,所以的从头一个脚印的来,走通了之后决定写一个帖子,以免需要用的人少走歪路,节约时间。 官网上已经教我们如何跑起来yolo v3,因此大部分时间其实花在制作数据集上。总体来说,分为四个步骤,分别是:标注数据,利用voc制作自己的数据集,... 阅读详情

版本

1.1 [2007-2-12]

简介

本教程在《NBearV3 Step by Step教程——IoC篇》的基础上,演示如何基于NBearV3的MVP模块实现基于NBear的IoC的MVP模式的过程。您将看到,利用封装了NBear的IoC模块的NBear.MVP模块,不仅能大大加强系统表现层的可测试性,同时能充分利用NBear已有的IoC模块获得依赖注入能力及基于IoC的分布式服务支持。

注:在阅读本文之前,建议读者先阅读《NBearV3 Step by Step教程——IoC篇》以掌握NBearV3中有关ORM和IoC的基本知识。

目标

通过本教程,读者应能够全面掌握使用NBearV3的MVP模块实现表现层MVP模式。

代码

本教程演示创建的所有工程和代码,包含于可以从nbear.org下载的NBearV3最新源码zip包中的tutorials/MVP_Tutorial目录中。因此,在使用本教程的过程中如有任何疑问,可以直接参考这些代码。

时间

<45分钟。

正文

Step 1 下载NBearV3最新版本及准备

1.1访问http://nbear.org,下载NBearV3的最新版本到本地目录。

1.2 将下载的zip文件解压至C:/,您将看到,加压后的NBearV3目录中包括:dist、doc、cases、src、tutorials等目录。其中,在本教程中将会使用的是dist目录中的所有release编译版本的dll和exe和tutorials目录中之前的IoC基础教程。

1.3 将tutorials目录中的整个IoC_Tutorial目录复制到任意其它位置,并命名为MVP_Tutorial,我们将以IoC_Tutorial为基础,演示NBearV3中基于IoC的分布式开发的知识。

Step 2 定义View和Presenter

2.1 将MVP_Tutorial中的IoC_Tutorial.sln重命名为MVP_Tutorial.sln,并在VS2005开发环境中打开。

2.2 我们知道MVP模式中,有Model、View和Presenter三个部分。在NBear.MVP中,Model部分,我们直接使用基于NBear.IoC的Service,因此,对于原来的IoC教程的代码,我们只需要额外定义View和Presenter的代码。为了充分解耦M、V、P三部分,我们将用到接口、范型和IoC技术。

2.3 为sln新增一个名叫ViewInterfaces的类库工程。添加该工程到dist/NBear.Common.dll和Entities工程的引用。在ViewInterfaces中增加一个ISampleView.cs文件,包含如下内容:

 1 using  System;
 2 using  Entities;
 3
 4 namespace  ViewInterfaces
 5 {
 6    public interface ISampleView
 7    {
 8        int CategoryID get; }
 9        Category[] Categories set; }
10        Product[] ProductsInCategory set; }
11    }

12}

2.4 为sln新增一个名叫PresenterInterfaces的类库工程。添加该工程到dist/NBear.Common.dll、NBear.MVP.dll和Entities工程的引用。在PresenterInterfaces中增加一个ISamplePresenter.cs文件,包含如下内容:

 1 using  System;
 2 using  Entities;
 3 using  NBear.MVP;
 4
 5 namespace  PresenterInterfaces
 6 {
 7    public interface ISamplePresenter : IPresenter
 8    {
 9        void GetCategories();
10        void GetProductsInCategory();
11    }

12}

2.5 为sln新增一个名叫PresenterImpls的类库工程。添加该工程到dist/ NBear.Common.dll、NBear.IoC.dll、NBear.MVP.dll、ServiceInterfaces、ViewInterfaces、PresenterInterfaces和Entities工程的引用。在PresenterImpls中增加一个SamplePresenter.cs文件,实现前面定义的ISamplePresenter,包含如下内容:

 1 using  System;
 2 using  System.Collections.Generic;
 3 using  Entities;
 4 using  ServiceInterfaces;
 5 using  PresenterInterfaces;
 6 using  ViewInterfaces;
 7 using  NBear.MVP;
 8
 9 namespace  PresenterImpls
10 {
11    public class SamplePresenter : Presenter<ISampleView, ICategoryService>, ISamplePresenter
12    {
13        ISamplePresenter Members
40    }

41}

2.6 至此,需要的View接口、Presenter接口和实现都定义完了。对PresenterImpls,可以和ServiceImpls一样进行独立的测试。这是MVP模式最大的好处。注意,PresenterImpls中SamplePresenter继承自NBear.MVP中定义的Presenter基类,并实现IPresenter接口。该接口和基类为Presenter提供了对NBear.IoC的封装,在继承类中,可以访问Presenter基类中定义的view和model这两个protected的成员变量,分别访问关联的view和model。下面,我们将修改website以使用这些类。您将看到NBear.MVP通过 NBear.IoC获得的依赖注入能力。

Step 3 在website中使用View和Presenter

3.1 在website工程中,先删除原来的Default.aspx和关联的Default.aspx.cs中的代码,并添加website到ViewInterfaces、PresenterInterfaces和PresenterImpls(其实无需添加对PresenterImpls的引用,而只需要将PresenterImpls.dll复制到website的bin目录,这里为了省区手动复制的过程才增加了它的引用)工程的引用。我们为Default.aspx增加一个DropDownList、一个Button和一个GridView控件如下:

 1 <% @ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default"  %>
 2
 3 <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
 4
 5 < html  xmlns ="http://www.w3.org/1999/xhtml"   >
 6 < head  runat ="server" >
 7      < title > Untitled Page </ title >
 8 </ head >
 9 < body >
10      < form  id ="form1"  runat ="server" >
11      < div >
12         Choose a Category: &nbsp; < asp:DropDownList  ID ="listCategories"  runat ="server"  DataTextField ="CategoryName"
13             DataValueField ="CategoryID" >
14          </ asp:DropDownList >
15          < asp:Button  ID ="btnLoad"  runat ="server"  OnClick ="btnLoad_Click"  Text ="Load Products in Selected Cateogry"   />< br  />
16          < br  />
17          < asp:GridView  ID ="gridProducts"  runat ="server" >
18          </ asp:GridView >
19      </ div >
20      </ form >
21 </ body >
22 </ html >

3.2 在Default.aspx.cs中,我们需要实现前面定义的ISampleView接口,并使用我们已经定义的SamplePresenter。和使用NBear.IoC 中的ServiceFactory类似,我们可以非常简单的使用NBear.MVP中定义的PresenterFactory类,通过Presenter接口得到其实现。代码如下:

 1 using  System;
 2 using  System.Data;
 3 using  System.Configuration;
 4 using  System.Web;
 5 using  System.Web.Security;
 6 using  System.Web.UI;
 7 using  System.Web.UI.WebControls;
 8 using  System.Web.UI.WebControls.WebParts;
 9 using  System.Web.UI.HtmlControls;
10
11 using  Entities;
12 using  ViewInterfaces;
13 using  PresenterInterfaces;
14 using  NBear.MVP;
15
16 public  partial  class  _Default : System.Web.UI.Page, ISampleView
17 {
18    private ISamplePresenter presenter;
19
20    protected void Page_Load(object sender, EventArgs e)
21    {
22        presenter = PresenterFactory.Create().GetPresenter<ISamplePresenter>(this);
23        if (!IsPostBack)
24        {
25            presenter.GetCategories();
26            DataBind();
27        }

28    }

29
30    protected void btnLoad_Click(object sender, EventArgs e)
31    {
32        presenter.GetProductsInCategory();
33        gridProducts.DataBind();
34    }

35
36    ISampleView Members
70}

通过PresenterFactory类的Create()我们就能获得一个PresenterFactory类的singleton实例。通过GetPresenter()方法,传入Presenter的接口作为范型参数,页面自己this作为实现了ISampleView接口的实例的唯一的参数,就能得到需要的Presenter的实现类实例,这个内部的过程是通过NBear.IoC的ServiceFactory实现的,因此,可以和IoC_Adv教程中一样使用基于分布式IoC的Service作为Model。

我们可以看到,website仅依赖于PresenterInterfaces,Prensenter的具体实现通过IoC以依赖注入方式获得。这样,我们可以方便地仅修改配置文件(无需重新编译)就改变Presenter接口对应的具体的Presenter实现类。

特别注意,我们在使用SamplePresenter时完全没有指定Model的位置,那么SamplePresenter怎么知道哪个model对应当前的view呢?他会通过IPresenter接口(所有的Presenter需要实现该接口)的TypeOfModel属性返回的type,通过NBear.IoC.Service.ServiceFactory.GetService<type>()从IoC容器中自动获得的。也因此,它自动获得了分布式能力。

3.3 在Web.config中的castle配置节中,因为我们的程序只需要用到category service,我们可以将product service删掉。但是,我们要在castle配置节中增加ISamplePresenter和SamplePresenter的配置。修改后的Web.config代码如下:

 1 <? xml version="1.0" ?>
 2 < configuration >
 3      < configSections >
 4          < section  name ="entityConfig"  type ="NBear.Common.EntityConfigurationSection, NBear.Common" />
 5      < section  name ="castle"  type ="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" />
 6    </ configSections >
 7      < entityConfig >
 8          < includes >
 9              < add  key ="Sample Entity Config"  value ="~/EntityConfig.xml" />
10          </ includes >
11      </ entityConfig >
12    < castle >
13      < components >
14        <!-- You can use standard castle component decleration schema to define service interface impls here -->
15        < component  id ="category service"  service ="ServiceInterfaces.ICategoryService, ServiceInterfaces"  type ="ServiceImpls.CategoryService, ServiceImpls" />
16        <component id="sample presenter" service="PresenterInterfaces.ISamplePresenter, PresenterInterfaces" type="PresenterImpls.SamplePresenter, PresenterImpls"/>
17      </ components >
18    </ castle >
19    < appSettings />
20      < connectionStrings >
21          < add  name ="Northwind"  connectionString ="Server=(local);Database=Northwind;Uid=sa;Pwd=sa"  providerName ="NBear.Data.SqlServer.SqlDbProvider" />
22      </ connectionStrings >
23      < system .web >
24          < compilation  debug ="true" >
25              < assemblies >
26                  < add  assembly ="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
27                  < add  assembly ="System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
28                  < add  assembly ="System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /></ assemblies ></ compilation >
29          < authentication  mode ="Windows" />
30      </ system.web >
31 </ configuration >

3.4 运行website并浏览Default.aspx页面,我们就可以看到我们实现的功能了。改变Category的选择,点击按钮就能查看不同的Category下的Products。

后记

如果看过其他MVP模式的实现,读者可能会注意到某些区别。在这里的实现中,Presenter不需要知道何时绑定数据,不需要处理事件回调,而只需要负责对view和model进行数据传递、验证和过滤。何时绑定,以及哪些数据在IsPostBack时需要重新载入,哪些数据只需要在页面初次载入时载入都是由Default页面自己控制的。这样做的好处是,Presenter对具体的表现层(这里是可以PostBack的页面)没有任何概念上的依赖,做到了真正的解耦。即使要将该Presenter和Model应用到WindowsForm或者WPF表现层,也是轻而易举的。


V1.1新增 –Presenter何如使用到多个Model?

上面的示例中的Presenter是比较典型的一个View对应Model(或者说Service)的情况。在实际的开发中,经常会出现一个Presenter需要访问到多个Model的情况。

此时,可以有两种可选的做法:

1、 具体的Presenter继承含多个Model泛型参数的Presenter基类,如:Presenter<IView, IModel1, IModel2>, Presenter<IView, IModel1, IModel2, IModel3>等。使用和配置Presenter的方法和前文讨论的方法完全一致。

2、 具体的Presenter继承不含Model的Presenter<IView>基类。在Presenter具体实现类中,当需要使用任意Model(或者说Service时),只需要使用NBear.IoC.Service.ServiceFactory.Create().GetService<IServiceType>()方法就能获得需要的Service的实例,然后,就能方便的调用service的方法。很明显,使用这种方法相比方法1更灵活。因此,也是推荐的做法

//正文结束

//本文结束

SQL注入教程——(三)简单的注入尝试 本文将以简单的SQL注入实例来讲解SQL注入的基本思路与流程,当然本文实例只是注入的一种情况,初学者应重点理解思路,学会举一反三。GET与POST进行SQL注入攻击,大家还需要了解两种基本的 HTTP 请求方法:GET 和 POST。在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。 GET - 从指定的资源请求数据。 POST - 向指定的资源提交要被处理的数据 阅读详情

相关推荐

Led Control System V3.56

Led Control System V3.56 Led Control System V3.56 Led Control System V3.56Led Control System V3.56

LED循环播放节目

在LED行业,一般都会有多个节目显示,假如现在有10节目,里面的节目数据可能会为空或者不为空,每点击一下切换节目按钮,就切换下一条节目。当然,可以选择播放指定的节目,也可以循环播放所有的节目。当我们选择了循环播放节目的时候,加入1、3、5、7、9都存在节目,其他的节目为空,这里我们就希望,先播放第1条节目,然后播放第三条节目,之后按照这个顺序播放所有后续的节目,播放完毕后,又切换到第一条节目,这样

何文斌的专栏 4065

CSGO OTC V3 注入器

CSGO OTC V3 注入器

浅入MVPModel-View-Presenter

介绍:      现在UI技术的不断增强,UI层履行越来越多的职责,为了更好的细分视图层和模型层的功能,让View层更专注于处理数据的可视化与用户的交互,让Model层只去处理数据操作,相互不干扰,同时对于项目的单元测试和今后的项目维护都有着非常好的作用。因此,MVP模式是不可或缺的法宝。。。      MVP模式中包含3个主要元素:Model层:负责处理数据,可进行获取、存储、操作等功能。一般单...

Mr_NineSun的博客 646

NBearV3教程——MVP(Model/View/Presenter)

简介     本教程在《NBearV3 Step by Step教程——IoC》的基础上,演示如何基于NBearV3MVP模块实现基于NBear的IoCMVP模式的过程。您将看到,利用封装了NBear的IoC模块的NBear.MVP模块,不仅能大大加强系统表现层的可测试性,同时能充分利用NBear已有的IoC模块获得依赖注入能力及基于IoC的分布式服务支持。     注:在阅读本文之前,

Larsson的回收站 1490

安卓 presenter_如何在PowerPoint中使用Presenter View掌握演示文稿

安卓 presenterIn PowerPoint 2007 and 2010 there is a little feature called Presenter View that could help you get rid of your printed notes and track better your time when presenting. 在PowerPoint 2007和...

1630

java mvp设计模式,初探 MVP(Model View Presenter) 设计模式 | 学步园

刚刚转入C#开发不久,发现了一个类似于Java里的MVC模式的东东——MVP(Model View Presenter) 模式,个人感觉MVP模式真的和MVC差不多,MVC我这里就不解释了,着重讲讲MVPMVP 里的M 其实和MVC里的M是一个,都是封装了核心数据、逻辑和功能的计算关系的模型(这里我们不做重点介绍),而V是视图(窗体),P我认为就是封装了窗体中的所有操作、响应用户的输入输出、事件...

weixin_30784365的博客 696

MVP举例说明

平时我们所说的MVP,就是Mode View Presenter Mode是业务逻辑层,View是试图层,Presenter是中间者,平时交互的时候,     ViewPresenter之间(View能够调用Presenter的方法,Presenter返回只能是通过监听)     ModePresenter之间(在Presenter实例化出Mode的对象,调用其中对应的方法,同步方法通

yhq1913的博客 713

Android MVP开发模式解析

MVPModel-View-Presenter),Model提供数据,View界面显示,Presenter业务逻辑处理MVP从经典的模式MVC演变而来,其主要优点是变成面向接口开发。即把UI视图逻辑提取到View接口处理,把业务逻辑提取到Presenter接口中处理,而View不能直接对Model进行操作,所有的交互都发生在Presenter内部,让PresenterModel中获取数据后再处理

刘运召的博客 1109

mvp关联activity生命周期_安卓MVP浅析及Presenter的生命周期问题

现在来说,mvp不算是个新鲜的东西了,很多了都开始练手或者已经用到项目去了对于mvvm,databinding框架,用了下,发现很多问题,代码写起来也不友好,暂时不考虑m : model 模型.很多人理解成bean对象,我觉得不全是, 用获取数据比较贴切.在以前写mvc的时候,我习惯抽成initData()来表示modle.public interface Model {Beanload(St...

weixin_42560067的博客 529

Webug3.0 教程 第一关:很简单的一个注入 普通的GET注入

Webug3.0 教程 第一关:很简单的一个注入 普通的GET注入 说明:以下步骤是我打靶场的记录,与大家分享我的学习过程,请各位大佬指正。 本题考点:SQL注入之mysql的联合查询爆破。 1. 打开本题,看到的是这样的界面 2. 在原始URL后分别加’和’’,在输入’时数据库报错,发现有字符型SQL注入漏洞 数据库对于单引号的规则: 1.单引号必须成对出现,否则数据库就会报错; 2.如果两...

weixin_44716769的博客 992

MVPPresenter复用思路和Inject-mvp

MVP模式早已经不是什么新鲜词了,这里不再赘述。最近在重构代码的过程中,发现了一件及其痛苦的事情:很多时候,model层在应用中是很薄的,大多数的业务逻辑都在Presenter层,但是由于模版 代码,Activity(View)-&amp;amp;amp;amp;gt;P是一一对应绑定的关系,那这样,相当于只是把原来在Activity中的逻辑转移到了Presenter中,虽然一定程度上解耦了,方便单测了,但是事实上Present...

y1962475006的博客 3349

etcdctl v2 v3 使用指南

etcd2和etcd3是不兼容的,两者的api参数也不一样,详细请查看 etcdctl -h 。 可以使用api2 和 api3 写入 etcd3 数据,但是需要注意,使用不同的api版本写入数据需要使用相应的api版本读取数据。 api 2 使用方法 ETCDCTL_API=2 etcdctl ls / api 3 使用方法 ETCDCTL_API=3 etcdctl get / 问...

kozazyh的专栏 1万+

参数注入:最简方法,直接注入

文章目录把参数写进默认文件里application.properties直接注入,会直接把默认文件里prefix打头的文件加载进去,这样有个缺点就是都是完全载入。 把参数写进默认文件里application.properties 直接注入,会直接把默认文件里prefix打头的文件加载进去,这样有个缺点就是都是完全载入。 ...

weixin_40759186的博客 5429

接口式实体定义之——自定义实体属性+实体多根继承

本文介绍NBear的接口式实体定义方式下的自定义实体属性和实体多根继承。本文中的介绍的内容及对应的代码同样包含于最新版本的NBear及其用户手册中。从SF.Net下载NBear及用户手册从博客园下载用户手册最新版本的NBear中除了本文中提到的两个功能之外,还包括如下内容:1)支持EntityFactory.CreateObject和CreateObjectList现在支持基于DataS

Teddy's Knowledge Base 1066

Web Application Architectures: Simple 2 Layer, Standard 3 Layer and Distributed 3 Layer

Abstract:This article discusses three common web application architectures: Simple 2 Layer, Standard 3 Layer and Distributed 3 Layer. For each architecture, it gives an ASP.NET 2.0 sample imple

Teddy's Knowledge Base 921

ORM中的继承关系映射全解——单表继承体系、一实体一具体表、一实体一扩展表、接口映射

实体继承是基于OO和关系型数据库软件系统设计中的一个重要主题。本文通过基于NBear的实例解析ORM中的实体继承体系映射的方方面面。本文涉及的内容包括:1. 单表继承体系2. 一实体一具体表3. 一实体一扩展表4. 接口实现映射vs基类继承映射1. 单表继承体系所谓单表继承体系就是用一张数据库表存储整个继承体系中的所有实体的数据。单表继承体系适合那种继承体系中实体数目相对较少,总记录

Teddy's Knowledge Base 896
上一篇: NBearV3.3.7 发布 - 震撼人心的VsPlugin来了!
下一篇: Suggested NBear Framework Based FDD Development Steps
teddyma
博客等级 码龄25年 5粉丝 187原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值