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;
}
}