概要

该演示项目利用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. nginx旧版本升级新版本

        比如我们现在所用的是 nginx 是1.4 版本,过了一段时间后我们有新的稳定版 1.6 问世,我们想升级到新的版本怎么办?           1.把新版本解压.安装,然后将 sbin/ng ...

  2. NOIP2017 Day-1 模板荟萃

    #include<bits/stdc++.h> #define MAXN 100005 using namespace std; int read(){ ;char c=getchar() ...

  3. 洛谷1005 【NOIP2007】矩阵取数游戏

    问题描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  4. PHP安全性防范方式

    SQL注入 SQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行. 防范方式 使用mysql_real_escape_string(),或者addslashes()过 ...

  5. mysql-5.7.25安装及常用语法

    我下的是免安装版的压缩文件包,可以选择下载.msi的程序包,那样就可以通过常见的图形界面来进行安装配置了 参考链接:https://blog.csdn.net/qq_23994787/article/ ...

  6. Invalid command &#39;WSGIScriptAlias&#39;, perhaps misspelled or defined by a module not included in the ser

    没有Include wsgi,执行: sudo a2enmod wsgi 可能出现以下的错误 ERROR: Module mod-wsgi does not exist! 安装 libapache2- ...

  7. Gym - 100625J Jailbreak 最短路+搜索

    http://codeforces.com/gym/100625/attachments/download/3213/2013-benelux-algorithm-programming-contes ...

  8. Sqoop Import原理和详细流程讲解

    Sqoop Import原理 Sqoop Import详细流程讲解 Sqoop在import时,需要指定split-by参数.Sqoop根据不同的split-by参数值来进行切分,然后将切分出来的区域 ...

  9. 一张图了解javaJwt

    1.什么是javaJwt? JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims ...

  10. UltraEdit Companion Utility

    UltraEdit Companion Utility 配色组件 http://www.danielwmoore.com/extras/index.php?action=downloads;sa=vi ...