Identity Map – Паттерны Объектно-Реляционной логики (PoEAA)
Назначение:
Обеспечивает однократную загрузку объекта, сохраняя данные об объекте в карте соответствия. При обращении к объектам, ищет их в карте соответсвия.
Может получиться, что разработчик загрузит данные из БД в два разных объекта. Потом, когда он сохранит их, получится путаница и коллизия различных данных.
Более того, с этим связаны проблемы производительности. Когда дважды загружается одна и та же информация, увеличиваются затраты на передачу данных. Таким образом, отказ от загрузки одних и тех же данных дважды не только обеспечивает корректность информации, но и ускоряет работу приложения.
Паттерн Identity Map хранит записи о всех объектах, которые были считаны из БД за время выполнения одного действия. Когда происходит обращение к объекту, проверяется карта соответствия (присутствия), чтобы узнать, загружен ли объект.
Пример реализации паттерна на C#:
class Book
{
public long Id { get; set; }
public string Name { get; set; }
}
class IdentityMap
{
private static readonly IdentityMap Instance = new IdentityMap();
private readonly Dictionary<long, Book> _books = new Dictionary<long, Book>();
private IdentityMap() { }
public static void AddBook(Book book)
{
Instance._books.Add(book.Id, book);
}
public static Book GetBook(long id)
{
return Instance._books[id];
}
}