using Microsoft.EntityFrameworkCore; /* Заместитель Предоставляет объект-заместитель другого объекта для контроля доступа к нему */ class Program { static void Main() { #region Пример №1 - базовое using (IBook book = new BookStoreProxy()) { //читаем первую страницу Page page1 = book.GetPage(1); Console.WriteLine(page1.Text); //читаем первую страницу Page page2 = book.GetPage(2); Console.WriteLine(page1.Text); //возвращаемся на первую страницу page1 = book.GetPage(1); Console.WriteLine(page1.Text); } Console.ReadKey(); #endregion } } /// /// отдельная страница книги /// /// Идентификатор /// Номер /// Содержимое record Page(int Id, int Number, string Text); class PageContext : DbContext { public DbSet Pages { get; set; } } interface IBook : IDisposable { Page GetPage(int number); } class BookStore : IBook { PageContext db; public BookStore() { db = new PageContext(); } public void Dispose() { db.Dispose(); } public Page GetPage(int number) { return db.Pages.FirstOrDefault(p => p.Number == number); } } class BookStoreProxy : IBook { List Pages; BookStore bookStore; public BookStoreProxy() { Pages = new List(); } public void Dispose() { if (bookStore != null) bookStore.Dispose(); } public Page GetPage(int number) { Page page = Pages.FirstOrDefault(p => p.Number == number); if(page == null) { if(bookStore == null) bookStore = new BookStore(); page = bookStore.GetPage(number); Pages.Add(page); } return page; } }