1.Identity Map模式简介

  Identity Map(标识映射)模式是通过将所有已加载对象放在一个映射中确保所有对象只被加载一次,并且在引用这些对象时使用该映射来查找对象。在处理数据并发访问时,要有一种策略让多个用户共同影响同一个业务实体,这个固然很重要。同样重要的是,单个用户在一个长运行事务或复杂事务中始终使用业务实体的一致版本。Identity Map模式提供的功能;为事务中使用所有的业务对象均保存一个版本,如果一个实体被请求两次,返回同一个实体。
  每个业务事务使用一个Identity Map,可以确保如果在同一个事务中两次检索同一个实体,则该实体将是唯一的,而且包含该事务所做的任何修改。

  2.Identity Map模式示例

  代码结构:

  Employee.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DataAccessPatterns.IdentityMapPattern.Model
{
public class Employee
{
public Guid ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
}

  IEmployeeRepository.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DataAccessPatterns.IdentityMapPattern.Model
{
public interface IEmployeeRepository
{
Employee FindBy(Guid ID);
}
}

  IdentityMap.cs:   该类使用泛型提供类型安全的Identity Map实现,用于在业务事务期间提供唯一的实体。Identity Map包含一个散列表来存储事务中使用的业务实体,并提供简单的接口来存储和检索实体。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DataAccessPatterns.IdentityMapPattern.Repository
{
public class IdentityMap<T>
{
Hashtable entities = new Hashtable(); public T GetByID(Guid id)
{
if (entities.ContainsKey(id))
{
return (T)entities[id];
}
else
{
return default(T);
}
} public void Store(T entity, Guid key)
{
if (!entities.ContainsKey(key))
{
entities.Add(key, entity);
}
}
}
}

  EmployeeRepository.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DataAccessPatterns.IdentityMapPattern.Model; namespace DataAccessPatterns.IdentityMapPattern.Repository
{
public class EmployeeRepository : IEmployeeRepository
{
private IdentityMap<Employee> _employeeMap; public EmployeeRepository(IdentityMap<Employee> employeeMap)
{
_employeeMap = employeeMap;
} public Employee FindBy(Guid Id)
{
Employee employee = _employeeMap.GetByID(Id); if (employee == null)
{
employee = DatastoreFindBy(Id); if (employee != null)
{
_employeeMap.Store(employee, employee.ID);
}
} return employee;
} private Employee DatastoreFindBy(Guid Id)
{
Employee employee = default(Employee); // Code to hydrate employee from datastore...
return employee;
}
}
}

  调用FindBy方法时,Employee Repository首先检查IdentityMap以确定之前是否已经检索Employee实体。如果是,则将其返回给调用者。如果没有,则使用Employee实例的标识从数据存储中查询该实例,然后将其添加到IdentityMap中,如果再次需要从Employee Repository中检索同样的Employee实体,就可以直接使用它。

数据访问模式:Identity Map(标识映射)模式的更多相关文章

  1. Razor视图引擎布局 Razor视图引擎的基本概念与法语 SQL Server Mobile 和 .NET 数据访问接口之间的数据类型映射 binary 和 varbinary datetime 和 smalldatetime float 和 real

    Razor视图引擎布局   不需要像过去aspx一样,使用.Master文件,而是统一使用.cshtml 或 .vbhtml文件.但文件名一般以 _开头,这样做文件不会当做View显示出来 使用@Re ...

  2. 【串线篇】SpringBoot数据访问【数据源/mybatis/指定映射文件位置】

    一.配置数据源 1.1.jdbc版本 JDBC(.tomcat.jdbc.pool.DataSource作为数据源) <?xml version="1.0" encoding ...

  3. SQL Server Mobile 和 .NET 数据访问接口之间的数据类型映射

      .NET 数据类型 SQL Server Mobile 数据类型 binary varbinary boolean bit byte tinyint byte[] varbinary dateti ...

  4. Entity Framework中的Identity map和Unit of Work模式

    阅读目录: 一.什么是Identity map模式 二.关于Identity map模式的验证示例 三.Unit of Work 模式 四.总结和注意的问题 一,什么是Identity map模式 I ...

  5. Entity Framework中的Identity map和Unit of Work模式(转)

    一,什么是Identity map模式 Identity map是EF获取和缓存数据的模式.Identity map模式指的是任何数据都只会被加载一次,以map的形式缓存,以唯一的identity来再 ...

  6. Windows GDI 映射模式(出自:Windows程序设计第5版-珍藏版)

    GDI映射模式(mapping mode):和映射模式紧密相关的还有4个其它的设备环境属性:1.窗口原点(window origin)2.视口原点(viewport origin)3.窗口范围(win ...

  7. 一个类GraphQL的ORM数据访问框架发布

    Zongsoft.Data 发布公告 很高兴我们的 ORM 数据访问框架(Zongsoft.Data)在历经两个 SaaS 产品的应用之后,今天正式宣布对外推广! 这是一个类 GraphQL 风格的  ...

  8. PHP 设计模式 笔记与总结(10)数据对象映射模式 2

    [例2]数据对象映射模式结合[工厂模式]和[注册模式]的使用. 入口文件 index.php: <?php define('BASEDIR',__DIR__); //定义根目录常量 includ ...

  9. PHP 设计模式 笔记与总结(9)数据对象映射模式

    [数据对象映射模式] 是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作.例如在代码中 new 一个对象,使用数据对象映射模式就可以将对象的一些操作比如设置一些属性,就会自动保存到数 ...

随机推荐

  1. 【原】iOS学习之图片拉伸处理(类似qq的气泡)

    原理是拉伸里面的内容,将边保护起来 方法1: ①[image resizableImageWithCapInsets:UIEdgeInsetsMake(, , , )]; ②[image resiza ...

  2. eclipse安装hibernate-Tools

    启动eclipse 选择Help -> About Eclipse 记住自己的eclipse版本 访问http://download.jboss.org/jbosstools/updates/s ...

  3. js中substr,substring,indexOf,lastIndexOf的用法小结

    第一组:str.substr(start,length) 和 str.substring(start,end) 定义: str.substr(start,length) substr(start,le ...

  4. 【翻译svg教程 】svg 的坐标系统

    http://tutorials.jenkov.com/svg/svg-coordinate-system.html svg的坐标系统(和大多数计算机绘图的坐标系统)和数学中绘图系统有点不一样 数学/ ...

  5. POJ 1979 题解

    Red and Black Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 31722   Accepted: 17298 D ...

  6. java的poi技术写Excel的Sheet

    在这之前写过关于java读,写Excel的blog如下: Excel转Html java的poi技术读,写Excel[2003-2007,2010] java的poi技术读取Excel[2003-20 ...

  7. wex5中的星星评分

    新建一个空白的.w文件,然后在页面上放5个img星星图片 重要的是图片路径不能是绝对路径,要用相对路径,不然js操作的时候会出bug 添加两个label标签(标签随你挑,在这我就用label) 你到时 ...

  8. HashMap实现缓存(二)

    package com.cache; import java.util.*; //Description: 管理缓存 //可扩展的功能:当chche到内存溢出时必须清除掉最早期的一些缓存对象,这就要求 ...

  9. sql server2008 代码折叠

    方法一: 用‘GO’来分开使代码折叠 可以看出go后面的自动有折叠 ,如果只有一行代码,则不会显示 方法二: 用’begin end‘来分开使代码折叠 使用begin end 可以使代码折叠 方法三: ...

  10. uboot

    ******************************************day:2014/10/14**************************uboot************* ...