概要

该演示项目利用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 设计示例经典的更多相关文章

  1. WPF MVVM 架构 Step By Step(6)(把actions从view model解耦)

    到现在为止,我们创建了一个简单的MVVM的例子,包含了实现了的属性和命令.我们现在有这样一个包含了例如textbox类似的输入元素的视图,textbox用绑定来和view model联系,像点击but ...

  2. WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)

    我们第一步就是去了解三层架构和问题然后去看MVVM是怎么去解决这些问题的. 现在,感觉和事实是完全不同的两个东西.当你看到三层架构的框图的时候,你会觉得每层的职责被分配的很好.但是当你你真的去写代码的 ...

  3. 基于 WPF 模块化架构下的本地化设计实践

    背景描述 最近接到一个需求,就是要求我们的 WPF 客户端具备本地化功能,实现中英文多语言界面.刚开始接到这个需求,其实我内心是拒绝的的,但是没办法,需求是永无止境的.所以只能想办法解决这个问题. 首 ...

  4. [译]WPF MVVM 架构 Step By Step(5)(添加actions和INotifyPropertyChanged接口)

    应用不只是包含textboxs和labels,还包含actions,如按钮和鼠标事件等.接下来我们加上一些像按钮这样的UI元素来看MVVM类怎么演变的.与之前的UI相比,这次我们加上一个"C ...

  5. WPF MVVM 架构 Step By Step(1)(介绍)

    生命就是我们从孩子开始,经过不断的学习成为成熟的成年人的进化过程.这和软件的架构有着异曲同工之妙,我们从基础的架构开始,随着需求和环境的变化不断的进化. 如果你去问任何一个.net开发者,什么是最基础 ...

  6. WPF MVVM 架构 Step By Step(4)(添加bindings - 完全去掉后台代码)

    之前的改进已经挺棒的,但是我们现在知道了后台代码的问题,那是否可能把后台代码全部去除呢?这时候就该WPF binding 和 commands 来做的事情了. WPF就是以超吊的binding,com ...

  7. WPF MVVM 架构 Step By Step(3)(把后台代码移到一个类中)

    我觉得大部分开发者应该已经知道怎么去解决这个问题.一般都是把后台代码(GLUE code)移动到一个类库.这个类库用来代表UI的属性和行为.任何代码当被移到一个类库中时都可以被编译成一个DLL,然后可 ...

  8. C# WPF - MVVM实现OPC Client管理系统

    前言 本文主要讲解采用WPF MVVM模式设计OPC Client的过程,算作对于WPF MVVM架构的学习记录吧!不足之处请不吝赐教,感谢! 涉及知识点 C#基础 Xaml基础 命令.通知和数据绑定 ...

  9. WPF MVVM+EF增删改查 简单示例(二) 1对1 映射

    WPF MVVM+EF增删改查 简单示例(一)实现了对学生信息的管理. 现在需求发生变更,在录入学生资料的时候同时需要录入学生的图片信息,并且一名学生只能有一张图片资料.并可对学生的图片资料进行更新. ...

随机推荐

  1. HDU-1069 Monkey and Banana DAG上的动态规划

    题目链接:https://cn.vjudge.net/problem/HDU-1069 题意 给出n种箱子的长宽高 现要搭出最高的箱子塔,使每个箱子的长宽严格小于底下的箱子的长宽,每种箱子数量不限 问 ...

  2. js闭包实例展示

    准确来说,闭包是基于正常的垃圾回收处理机制下的.也就是说,一般情况一个函数(函数作用域)执行完毕,里面声明的变量会全部释放,被垃圾回收器回收.但闭包利用一个技巧,让作用域里面的变量,在函数执行完之后依 ...

  3. 今日SGU 5.25

    SGU 194 题意:无源汇有上下界的最大流 收获:https://wenku.baidu.com/view/0f3b691c59eef8c75fbfb35c.html #include<bit ...

  4. Maven 工程 POM.XML文件最全详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. 【Henu ACM Round#20 D】 Devu and Partitioning of the Array

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 一开始所有的数字单独成一个集合. 然后用v[0]和v[1]记录集合的和为偶数和奇数的集合它们的根节点(并查集 然后先让v[0]的大小 ...

  6. Intel Media SDK 性能測试

    经过測试,发如今windows 7上 i3 i5 上Intel Media SDK 1080P仅仅能解6路,720P仅仅能解8路, 不知大家有没有測试过?

  7. 基于CC2530的ZigBee转以太网网关的设计与实现

    *已刊登至:<无线电>8月刊 物联网技术的实现中,无线技术是必不可少的部分. 近年无线技术的发展,将ZigBee推入人们的视线中.那么ZigBee是如何的一种技术呢?带着疑问.我查询了它的 ...

  8. java 爬虫在 netbeans 里执行和单独执行结果不一样

    在做内容測试的时候.发现我的爬虫(前些文章略有提及)在 netbeans 里面可以成功爬取网页内容,而单独执行时,给定一个 url,爬到的网页却与在浏览器里面打开 url 的网页全然不一样,这是一个非 ...

  9. POJ 1671 第二类斯特林数

    思路: 递推出来斯特林数 求个和 if(i==j)f[i][j]=1; else f[i][j]=f[i-1][j-1]+f[i-1][j]*j; //By SiriusRen #include &l ...

  10. OpenCV中InputArray和OutputArray使用方法

    原文链接:http://blog.csdn.net/yang_xian521/article/details/7755101 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArr ...