`
javababy1
  • 浏览: 1225031 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

WCF+EF 实战四:UI层MVP模式处理

阅读更多

在本系列的第一篇中,我们曾经描述了本系统的整个实现结构,可以查看第一篇。

在客户端的实现我们将采用MVP模式来实现,就是将客户端再分为二层,UIpresenter,

UI主要是定义界面的元素及响应客户的操作。Presenter主要是对UI层响应客户端操作的业务处理。关于MVP的一些知识,如果不太清楚可以查看http://blog.csdn.net/greystar/archive/2008/12/01/3418307.aspx

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

MVP中的Model我们不需要实现了,因为WCF服务将会给我们提供相应的model.

下面我们新建一个类库Demo. Presentation,同时添加上次创建的WCF的服务的引用。(先要运行Demo.同时注意要点下图的高级,将返回的集合类型设为泛型List

由于我们的UI业务相当的简单,就是对Employee对象进行增删改查。因此首先我们定义

MVP中的View接口

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Demo.Presentation.WCFService;

namespace Demo.Presentation

{

public delegate void VoidEventHandler();

public interface IUserView

{

/// <summary>

/// 当前员工

/// </summary>

Employee CurrentEmployee { get; set; }

/// <summary>

/// 员工列表

/// </summary>

List<Employee> Users { set; }

/// <summary>

/// 新增事件

/// </summary>

event VoidEventHandler OnAddNewEmp;

/// <summary>

/// 删除

/// </summary>

event VoidEventHandler OnDeleteEmp;

/// <summary>

/// 更新

/// </summary>

event VoidEventHandler OnUpdateEmp;

/// <summary>

/// 初始事件

/// </summary>

event VoidEventHandler PrepareView;

}

/// <summary>

/// 定义员工业务的操作

/// </summary>

public interface IUserPresenter

{

void AddNewUser();

void DeleteUser();

List<Employee> GetUsers();

void UpdateUser();

}

}

Presenter的真正实现:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Demo.Presentation.WCFService;

namespace Demo.Presentation

{

public class UserPresenter:IUserPresenter

{

private IUserView view = null;

public UserPresenter(IUserView View)

{

view = View;

view.PrepareView += new VoidEventHandler(view_PrepareView);

view.OnAddNewEmp += new VoidEventHandler(AddNewUser);

view.OnDeleteEmp += new VoidEventHandler(DeleteUser);

view.OnUpdateEmp += new VoidEventHandler(UpdateUser);

}

void view_PrepareView()

{

view.Users = GetUsers();

}

#region IUserPresenter 成员

public void AddNewUser()

{

using (EmployeeServiceClient client = new EmployeeServiceClient())

{

view.CurrentEmployee= client.Add(view.CurrentEmployee);

}

}

public void DeleteUser()

{

using (EmployeeServiceClient client = new EmployeeServiceClient())

{

client.Delete(view.CurrentEmployee);

}

}

public List<Employee> GetUsers()

{

using (EmployeeServiceClient client = new EmployeeServiceClient())

{

return client.GetEmployees();

}

}

public void UpdateUser()

{

using (EmployeeServiceClient client = new EmployeeServiceClient())

{

client.Update(view.CurrentEmployee);

}

}

#endregion

}

}

}

现在我们来实现客户端的UI。当然UI要响应用户的操作,会调用到Demo. Presentation。但其本身不会直接处理任何数据。

添加一个window类库 Demo.UI

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using Demo.Presentation.WCFService;

using Demo.Presentation;

namespace Demo.UI

{

public partial class Form1 : Form,IUserView

{

IUserPresenter presenter = null;

BindingSource bs = null;

public Form1()

{

InitializeComponent();

presenter = new UserPresenter(this);

this.PrepareView();//初始化视图

}

#region IUserView 成员

Employee _currentEmployee = null;

public Employee CurrentEmployee

{

get

{

return _currentEmployee;

}

set

{

_currentEmployee = value;

}

}

public List<Employee> Users

{

set {

bs = new BindingSource();

bs.DataSource = value;

this.dataGridView1.DataSource = bs;

}

}

public event VoidEventHandler OnAddNewEmp;

public event VoidEventHandler OnDeleteEmp;

public event VoidEventHandler OnUpdateEmp;

public event VoidEventHandler PrepareView;

#endregion

private void cmdDelete_Click(object sender, EventArgs e)

{

if (SelectedEmployee != null)

{//可以先确认一下是否删除

OnDeleteEmp();

bs.Remove(_currentEmployee);//完成后将对象从界面中移除

}

}

private void cmdRefresh_Click(object sender, EventArgs e)

{

PrepareView();

}

private void cmdAdd_Click(object sender, EventArgs e)

{

_currentEmployee = new Employee();

//将此对象传到其他窗口,完成编辑

OnAddNewEmp();

bs.Add(_currentEmployee); //新增完成后_currentEmployee对象就是从服务器传回来的对象,有状态,下次更新就不会有问题。

//同时加入到界面中

}

private void cmdUpdate_Click(object sender, EventArgs e)

{

if (SelectedEmployee != null)

{

//此处可以将CurrentUser对象传给其他的窗体进行编辑。

//省略

OnUpdateEmp();

}

}

/// <summary>

/// 判断网格是否有选择的

/// </summary>

Employee SelectedEmployee

{

get

{

if (dataGridView1.SelectedRows.Count == 0)

return null;

_currentEmployee = this.dataGridView1.SelectedRows[0].DataBoundItem as Employee;

return _currentEmployee;

}

}

}

}

我们的界面实现了IUserView接口,在界面里只处理最基本的一些操作,而数据访问的实现实际是是由IUserPresenter来完成的。当有用户操作时,只需引发一些相关的事件。如果要进行UI的移植,那么相应的工作量将会大大的减少。

同时将刚才在Demo.Presentation里的app.config复制到Demo.UI里,此时你可以运行程序了。当然你要记得先运行Demo.WCFHost,再运行Demo.UI

仅仅是一个DEMO相对来说比较的简单,实际在使用EF时真的很难用。很多最终的SQL语句我发觉都不是自己想要的那种简单的。搞得太复杂了。网上的资料也比较少,同时也遇到了很多的难题。以后我会讲一下EF中遇到的问题。

本示例的源码下载:http://download.csdn.net/source/831860

分享到:
评论

相关推荐

    WCF+EF实战示例程序

    在WCF+EF的示例中,MVP模式可能被用来实现用户界面与服务层之间的解耦。 在这个示例程序中,`Employees.sql`文件可能是用于创建数据库的SQL脚本,包含了一些预定义的员工数据或者用于初始化数据库结构的命令。这与...

    DevExpress+WindowsService+WCF+EF+SQL

    标题中的"DevExpress+WindowsService+WCF+EF+SQL"是一个集成的开发框架,结合了多个技术,用于构建高效的企业级应用程序。以下是对这些技术及其在框架中作用的详细解释: 1. DevExpress:DevExpress是一个全面的...

    WPF+WCF+EF框架实例

    在“WPF+WCF+EF框架实例”中,这三个技术的结合为开发人员提供了一个完整的解决方案,用于构建数据驱动的、具有分布式特性的桌面应用程序。WPF负责前端的用户交互,展示数据和接收用户输入;WCF作为中间层,负责处理...

    EF+WCF+WPF(MVVM)

    【标题】"EF+WCF+WPF(MVVM)" 框架简单示例 这是一个集成Entity Framework(EF)、Windows Communication Foundation(WCF)和Windows Presentation Foundation(WPF)的项目,利用Model-View-ViewModel(MVVM)设计...

    EF + WCF + MVC3 OnlineShop 源码

    基于Entity Framework Code First, WCF, MVC3 的网上商店demo

    silverlight+wcf+EF

    5. **Silverlight客户端**:在Silverlight应用中引用WCF服务,实现UI与服务的交互,展示数据并处理用户操作。 6. **部署与测试**:发布WCF服务,部署到服务器;发布Silverlight应用,确保客户端能正常访问服务。 ...

    WCF+Winfrom Demo

    本文将深入探讨“WCF+Winform Demo”这一主题,这是一套整合了Windows Communication Foundation(WCF)和Windows Forms(Winform)技术的示例应用,旨在展示如何利用WCF服务来承载业务逻辑,并通过Winform客户端...

    WCF+LINQ+WPF+WWF很好的一个范例

    描述中提到的“一个学习WCF+LINQ+WPF很好的一个范例”,进一步强调了该项目的教育价值,适合那些希望深入理解并实战这四个关键的Microsoft .NET Framework组件的开发者。 **知识点详解** 1. **Windows ...

    WCF+WEB+WPF

    标题“WCF+WEB+WPF”和描述“WCF WEB WPF WinFrom承载”涉及了四个关键概念:Windows Communication Foundation (WCF),Web技术,Windows Presentation Foundation (WPF)以及WinForms。这些都是微软.NET框架下的核心...

    WCF+WINFORM的基础小例子

    在“WCF+WinForm的基础小例子”中,我们可以预见到以下几个关键知识点: 1. **创建WCF服务**:首先,你需要创建一个WCF服务项目,定义服务接口和实现。服务接口通常包含一系列操作合同,这些合同定义了服务可以执行...

    asp.net+wcf+entity framework

    通常,WCF服务作为中间层,处理客户端请求并调用数据访问层,这个数据访问层由Entity Framework提供。以下是一个简单的流程: 1. **客户端请求**:ASP.NET Web应用的客户端发送请求到WCF服务。 2. **WCF服务处理**...

    分享基于EF+WCF的通用三层架构及解析

    在IT行业中,构建高效、可扩展的软件系统是至关重要的,而基于EF(Entity Framework)+WCF(Windows Communication Foundation)的通用三层架构是实现这一目标的常见方式。本项目展示了如何利用这两种技术来构建一个...

    WCF开发实战

    WCF开发实战系列一:创建第一个WCF服务 WCF开发实战系列二:使用IIS发布WCF服务 WCF开发实战系列三:自运行WCF服务 WCF开发实战系列四:使用Windows服务发布WCF服务 WCF开发实战系列五:创建WCF客户端程序

    EF6.0+WCF+CodeFirst+SqlServer 对初学者帮助很大

    标题"EF6.0+WCF+CodeFirst+SqlServer 对初学者帮助很大"揭示了本文将深入探讨四个关键的IT技术:Entity Framework 6.0(简称EF),Windows Communication Foundation(WCF),CodeFirst开发模式以及Microsoft SQL ...

    WCF + NetTcpBinding 聊天室应用程序

    代理由WCF的**Service Reference**工具自动生成,它封装了调用服务方法和处理返回结果的逻辑。客户端可以发送登录、登出、发送消息等请求,并接收来自服务端的响应。 在**私聊**实现中,客户端需要指定接收者,...

    WPF+WCF+WWF+LINQ完美结合

    本示例程序以“WPF+WCF+WWF+LINQ完美结合”为主题,旨在展示如何在.NET框架3.0和3.5环境下,整合四种强大的技术:Windows Presentation Foundation (WPF)、Windows Communication Foundation (WCF)、Windows ...

    基于EF+WCF的通用三层架构源码及解析

    在IT行业中,构建高效、可扩展的软件系统是至关重要的,而"基于EF+WCF的通用三层架构源码及解析"则提供了一种实用的方法来实现这一目标。本项目利用Entity Framework(EF)4.3作为数据访问层,Windows Communication...

    wcf+mvc程序

    在标题提及的“WCF+mvc程序”中,我们可以推断这是一个使用ASP.NET MVC架构开发的小型应用程序,该程序集成了WCF服务以实现特定功能。开发者可能通过在MVC控制器中调用WCF服务,获取或更新数据,然后将这些数据传递...

    数据库:Sqlite,ORM:EF,实现WCF的四种挂载方式

    本文将深入探讨如何使用SQLite作为数据库,并结合ORM(对象关系映射)框架Entity Framework(EF),来实现Windows Communication Foundation(WCF)服务的四种挂载方式。我们将详细解析每种方法的配置步骤,以及在...

    WCF,EF框架

    结合WCF和EF,我们可以构建一个三层架构的应用程序:表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。在**WCF通讯**中,服务作为业务逻辑层的接口,接收客户端请求并调用BLL进行处理。BLL再通过EF与数据库进行...

Global site tag (gtag.js) - Google Analytics