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增删改查 简单示例(一)实现了对学生信息的管理. 现在需求发生变更,在录入学生资料的时候同时需要录入学生的图片信息,并且一名学生只能有一张图片资料.并可对学生的图片资料进行更新. ...
随机推荐
- Xwiki平台Windows搭建(Tomcat7 + XWiki6.2 + MySQL5.5)
背景介绍 国内xwiki安装使用资料较少,根据自己使用xwiki经验,总结出来,供参考,同时希望感兴趣的朋友能够一起讨论,XWiki是一个强大的Java开源的Wiki引擎. 它支持一些受欢迎的特性如: ...
- SpringMvc 系统启动时加载数据到内存中
SpringMvc 系统启动时加载数据到内存中 学习了:http://blog.csdn.net/newstruts/article/details/18668269 https://www.cnbl ...
- 《JSP+Servlet+Tomcat应用开发从零開始学》
当当网页面: http://product.dangdang.com/23619990.html 内容简单介绍 本书全面介绍了 JSP开发中涉及的相关技术要点和实战技巧. 全书结构清晰,难 ...
- Windows App开发之文件与数据
读取文件和目录名 这一节開始我们将陆续看到Windows App是如何操作文件的. 在Windows上读取文件名称.目录名 首先我们在XAML中定义一个Button和TextBlock,将读取文件/目 ...
- atitit.js 与c# java交互html5化的原理与总结.doc
atitit.js 与c# java交互html5化的原理与总结.doc 1. 实现html5化界面的要解决的策略 1 1.1. Js交互 1 1.2. 动态參数个数 1 1.3. 事件监听 2 2. ...
- django 笔记3
FBV function base view url.py index -> 函数名 view.py def 函数(requset): ... CBV class base view /inde ...
- Json 序列化以及反序列化的三种方式(二)
1.什么是JSON? Json[javascript对象表示方法],它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成,它是完全独立于语言的 2.Json支持下 ...
- Ubuntu 16.04 实现有线 无线同时用
因为工作的原因,经常会用有线网卡连接服务器进行配置,无线网卡上外网. 一.查看当前网关信息 pipci@ubuntu:~$ ip route showdefault via 192.168.2.1 d ...
- 【J-meter】参数及相应数据中文显示乱码问题
参考资料: http://www.51testing.com/html/00/130600-1360743.html http://www.cnblogs.com/fengpingfan/p/5851 ...
- 紫书 例题 9-13 UVa 1220 (最大独立子集)
这里的状态定义的非常的巧妙,d(i, 1)表示以i为根节点且选i的子树的最大独立子集 d(i, 0)表示以i为根节点且不选i的子树的最大独立子集 d(i, 1) = sum{ d(v, 0) | v是 ...
