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增删改查 简单示例(一)实现了对学生信息的管理. 现在需求发生变更,在录入学生资料的时候同时需要录入学生的图片信息,并且一名学生只能有一张图片资料.并可对学生的图片资料进行更新. ...
随机推荐
- 欢迎访问微先锋vXianFeng官方博客
欢迎访问微先锋vXianFeng官方博客,专注微商城.P2P理财.山寨矿机平台研究与开发!
- ip代理池的爬虫编写、验证和维护
打算法比赛有点累,比赛之余写点小项目来提升一下工程能力.顺便陶冶一下情操 本来是想买一个服务器写个博客或者是弄个什么FQ的东西 最后刷知乎看到有一个很有意思的项目,就是维护一个「高可用低延迟的高匿IP ...
- HDU-1878 欧拉回路 欧拉回路
题目链接:https://cn.vjudge.net/problem/HDU-1878 题意 中文题,而且就是单纯的欧拉回路 思路 判断连通图 用并查集会很好,bfs亦可 一时脑抽用bfs过了这个题, ...
- 【转载】Perl中字符串编码的处理
在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编 ...
- [NOIP1999]进制位(搜索)
P1013 进制位 题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E ...
- Android异步载入全解析之开篇瞎扯淡
Android异步载入 概述 Android异步载入在Android中使用的很广泛,除了是由于避免在主线程中做网络操作.更是为了避免在显示时由于时间太长而造成ANR,添加显示的流畅性,特别是像List ...
- localStorage 以及UserData[IE6 IE7]使用
说在前头: UserData:属于IE6 IE7的老东西.麻烦且体验差,暂且不表 localStorage 属于HTML5的东西,兼容IE8以及其它W3C标准的主流浏览器.所以尽可能的具体解说 注意: ...
- XMPP使用简单介绍--登录
在现阶段的通信服务中,各种标准都有.因此会出现无法实现相互连通,而XMPP(Extensible Message and presence Protocol)协议的出现,实现了整个及时通信服务协议的互 ...
- Vue进阶之事件处理器
过滤 <html> <head> <meta charset="UTF-8"> <meta name="viewport&quo ...
- Android - TextureView, SurfaceView和GLSurfaceView 以及 SurfaceTexture
这几个概念比较绕, 又比较相近. 初看比较糊涂, 把握关键点就好. 关键字 View SurfaceViewGLSurfaceViewTextureView这三个后缀都是View, 所以这三个东西都是 ...
