WPF MVVM架构 EF、WCF、IOC 设计示例经典
概要
该演示项目利用WPF应用程序构建的MVVM架构示例, 运用了Unity容器接口注入, MVVM的经典设计, 后台利用的EF+WCF。
后台实现:
从数据库生成的emdx 结合上下文进行数据交互, 服务以WCF发布:
public class FactoryManager
{
private IDataManager dataManager; public FactoryManager()
{
//can easily switch to other providers in the future without changing client code
dataManager = new EntityFrameworkManager();
} public ICustomerManager GetCustomerManager()
{
return dataManager.GetCustomerManager();
} public IOrderManager GetOrderManager()
{
return dataManager.GetOrderManager();
}
}
class EntityFrameworkManager : IDataManager
{
ICustomerManager IDataManager.GetCustomerManager()
{
return new CustomerManager();
} IOrderManager IDataManager.GetOrderManager()
{
return new OrderManager();
} class CustomerManager : ICustomerManager
{
int ICustomerManager.Add(string firstName, string lastName)
{
using (var context = new MasterDetailEntities())
{
Customer c = new Customer { FirstName = firstName, LastName = lastName };
context.Customers.AddObject(c);
context.SaveChanges();
return c.CustomerId;
}
} void ICustomerManager.Delete(int customerId)
{
using (var context = new MasterDetailEntities())
{
Customer c = context.Customers.Where(i => i.CustomerId == customerId).First();
context.DeleteObject(c);
context.SaveChanges();
}
} void ICustomerManager.Update(int customerId, string firstName, string lastName)
{
using (var context = new MasterDetailEntities())
{
Customer c = context.Customers.Where(i => i.CustomerId == customerId).First();
c.FirstName = firstName;
c.LastName = lastName;
context.SaveChanges();
}
} List<Customer> ICustomerManager.FindAll()
{
using (var context = new MasterDetailEntities())
{
return context.Customers.ToList();
}
} Customer ICustomerManager.FindByOrder(int orderId)
{
using (var context = new MasterDetailEntities())
{
return context.Orders.Where(i => i.OrderId == orderId).First().Customer;
}
}
} class OrderManager : IOrderManager
{
int IOrderManager.Add(string description, int quantity, int customerId)
{
using (var context = new MasterDetailEntities())
{
Order order = new Order { Description = description, Quantity = quantity };
context.Customers.First(i => i.CustomerId == customerId).Orders.Add(order);
context.SaveChanges();
return order.OrderId;
}
} void IOrderManager.Delete(int orderId)
{
using (var context = new MasterDetailEntities())
{
Order a = context.Orders.Where(i => i.OrderId == orderId).First();
context.DeleteObject(a);
context.SaveChanges();
}
} void IOrderManager.Update(int orderId, string description, int quantity)
{
using (var context = new MasterDetailEntities())
{
Order a = context.Orders.Where(i => i.OrderId == orderId).First();
a.Description = description;
a.Quantity = quantity;
context.SaveChanges();
}
} List<Order> IOrderManager.FindByCustomer(int customerId)
{
using (var context = new MasterDetailEntities())
{
return context.Customers.First(i => i.CustomerId == customerId).Orders.ToList();
}
} Order IOrderManager.Find(int orderId)
{
using (var context = new MasterDetailEntities())
{
return context.Orders.First(i => i.OrderId == orderId);
}
}
} }
WCF服务:
部分wcf接口实现:
[ServiceContract]
public interface ICustomerService
{
[OperationContract]
List<Customer> GetCustomers(); [OperationContract]
int AddCustomer(string FirstName, string LastName); [OperationContract]
void UpdateCustomer(Customer c); [OperationContract]
void DeleteCustomer(int customerId);
}
public class CustomerService : ICustomerService
{ List<Customer> ICustomerService.GetCustomers()
{
List<Customer> result = new List<Customer>();
foreach (Business.Customer i in Business.CustomerManager.Instance().CustomerList)
result.Add(new Customer(i));
return result;
} int ICustomerService.AddCustomer(string firstName, string lastName)
{
return Business.CustomerManager.Instance().AddCustomer(firstName, lastName);
} void ICustomerService.UpdateCustomer(Customer c)
{
Business.CustomerManager.Instance().UpdateCustomer(new Business.Customer(c.CustomerId, c.FirstName, c.LastName));
} void ICustomerService.DeleteCustomer(int customerId)
{
Business.CustomerManager.Instance().DeleteCustomer(customerId);
} }
Unity实现:
接口及实现:
public interface IServiceLocator
{
void Register<TInterface, TImplementation>() where TImplementation : TInterface; TInterface Get<TInterface>();
}
class UnityServiceLocator : IServiceLocator
{
private UnityContainer container; public UnityServiceLocator()
{
container = new UnityContainer();
} void IServiceLocator.Register<TInterface, TImplementation>()
{
container.RegisterType<TInterface, TImplementation>();
} TInterface IServiceLocator.Get<TInterface>()
{
return container.Resolve<TInterface>();
}
}
全局静态类
class ServiceProvider
{
public static IServiceLocator Instance { get; private set; } public static void RegisterServiceLocator(IServiceLocator s)
{
Instance = s;
}
}
进行Unitity容器接口注入:
//initialize all the services needed for dependency injection
//we use the unity framework for dependency injection, but you can choose others
ServiceProvider.RegisterServiceLocator(new UnityServiceLocator()); //register the IModalDialog using an instance of the CustomerViewDialog
//this sets up the view
ServiceProvider.Instance.Register<IModalDialog, CustomerViewDialog>();
ViewModel 模块操作进行Unitity容器获取接口实例(红色实现部分)
private void ShowAddDialog()
{
CustomerViewModel customer = new CustomerViewModel();
customer.Mode = Mode.Add; IModalDialog dialog = ServiceProvider.Instance.Get<IModalDialog>();
dialog.BindViewModel(customer);
dialog.ShowDialog();
}
MVVM DataContext关联ViewModel:
通过DataContext关联模块的ViewModel层实现所有的操作。
this.DataContext= xxViewModel;
view页面:
ViewModel部分绑定实现:
所有的ViewModel统一实现ViewModelBase 接口, 进行属性通知。
public ICommand UpdateCommand
{
get
{
if (updateCommand == null)
{
updateCommand = new CommandBase(i => this.Update(), null);
}
return updateCommand;
}
} public ICommand DeleteCommand
{
get
{
if (deleteCommand == null)
{
deleteCommand = new CommandBase(i => this.Delete(), null);
}
return deleteCommand;
}
}
源代码
WPF MVVM架构 EF、WCF、IOC 设计示例经典的更多相关文章
- WPF MVVM 架构 Step By Step(6)(把actions从view model解耦)
到现在为止,我们创建了一个简单的MVVM的例子,包含了实现了的属性和命令.我们现在有这样一个包含了例如textbox类似的输入元素的视图,textbox用绑定来和view model联系,像点击but ...
- WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)
我们第一步就是去了解三层架构和问题然后去看MVVM是怎么去解决这些问题的. 现在,感觉和事实是完全不同的两个东西.当你看到三层架构的框图的时候,你会觉得每层的职责被分配的很好.但是当你你真的去写代码的 ...
- 基于 WPF 模块化架构下的本地化设计实践
背景描述 最近接到一个需求,就是要求我们的 WPF 客户端具备本地化功能,实现中英文多语言界面.刚开始接到这个需求,其实我内心是拒绝的的,但是没办法,需求是永无止境的.所以只能想办法解决这个问题. 首 ...
- [译]WPF MVVM 架构 Step By Step(5)(添加actions和INotifyPropertyChanged接口)
应用不只是包含textboxs和labels,还包含actions,如按钮和鼠标事件等.接下来我们加上一些像按钮这样的UI元素来看MVVM类怎么演变的.与之前的UI相比,这次我们加上一个"C ...
- WPF MVVM 架构 Step By Step(1)(介绍)
生命就是我们从孩子开始,经过不断的学习成为成熟的成年人的进化过程.这和软件的架构有着异曲同工之妙,我们从基础的架构开始,随着需求和环境的变化不断的进化. 如果你去问任何一个.net开发者,什么是最基础 ...
- WPF MVVM 架构 Step By Step(4)(添加bindings - 完全去掉后台代码)
之前的改进已经挺棒的,但是我们现在知道了后台代码的问题,那是否可能把后台代码全部去除呢?这时候就该WPF binding 和 commands 来做的事情了. WPF就是以超吊的binding,com ...
- WPF MVVM 架构 Step By Step(3)(把后台代码移到一个类中)
我觉得大部分开发者应该已经知道怎么去解决这个问题.一般都是把后台代码(GLUE code)移动到一个类库.这个类库用来代表UI的属性和行为.任何代码当被移到一个类库中时都可以被编译成一个DLL,然后可 ...
- C# WPF - MVVM实现OPC Client管理系统
前言 本文主要讲解采用WPF MVVM模式设计OPC Client的过程,算作对于WPF MVVM架构的学习记录吧!不足之处请不吝赐教,感谢! 涉及知识点 C#基础 Xaml基础 命令.通知和数据绑定 ...
- WPF MVVM+EF增删改查 简单示例(二) 1对1 映射
WPF MVVM+EF增删改查 简单示例(一)实现了对学生信息的管理. 现在需求发生变更,在录入学生资料的时候同时需要录入学生的图片信息,并且一名学生只能有一张图片资料.并可对学生的图片资料进行更新. ...
随机推荐
- NodeJS学习笔记 (12)网络地址解析-url(ok)
模块概述 nodejs中,提供了url这个非常实用的模块,用来做URL的解析.在做node服务端的开发时会经常用到.使用很简单,总共只有3个方法. 正式讲解前,各位同学先把下面这个图记在心上(来自no ...
- 参考《深度学习之PyTorch实战计算机视觉》PDF
计算机视觉.自然语言处理和语音识别是目前深度学习领域很热门的三大应用方向. 计算机视觉学习,推荐阅读<深度学习之PyTorch实战计算机视觉>.学到人工智能的基础概念及Python 编程技 ...
- nl---统计行号
nl命令读取 file 参数(缺省情况下标准输入),计算输入中的行号,将计算过的行号写入标准输出.在输出中,nl命令根据您在命令行中指定的标志来计算左边的行.输入文本必须写在逻辑页中.每个逻辑页有头. ...
- ArcGIS api for javascript——查询没有地图的数据
描述 本例展示了用户能够从没有显示服务的地图服务查询数据.大部分地图服务包含属性信息的数据集,数据集能够被查询并显示在一个简单的列或表格里. 本例按提供的州名称查询USA人口普查数据,然后显示关于州的 ...
- Servlet具体解释
Servlet具体解释 基本概述 Session在计算机中,尤其是在网络应用中,称为"会话控制".在计算机专业术语中.Session是指一个终端用户与交互系统进行通信的时间间隔,通 ...
- EBS TimeZone问题
记录问题 : http://blog.csdn.net/cymm_liu/article/details/29234919 -- Oracle 数据库中的 时间 时区 http:// ...
- 推荐putty远程工具背景效果
设置高亮显示及其行号 syntax on set number 然后设置putty显示背景 如图 感觉这种效果比较舒适 推荐推荐
- centos 7.3 配置vnc 服务 图形界面登录
1.检查系统是否有安装tigervnc-server软件包 rpm -qa |grep vnc 默认的系统未装tigervnc-server软件包 2.安装tigervnc-server软件包 yum ...
- 在Navicat中如何新建数据库和表并做查询
上一篇文章,小编给大家分享了在Navicat中如何远程连接数据库,没有来得及上车的小伙伴可以戳这篇文章:在Ubuntu14.04中配置mysql远程连接教程.今天小编给大家分享一下如何在Navicat ...
- request.getSession().getServletContext().getRealPath("")获取工程目录 路径修改
使用request.getSession().getServletContext().getRealPath("")获取工程目录. 设置server Locations在serve ...