95 lines
2.1 KiB
C#
95 lines
2.1 KiB
C#
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
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// отдельная страница книги
|
||
/// </summary>
|
||
/// <param name="Id">Идентификатор</param>
|
||
/// <param name="Number">Номер</param>
|
||
/// <param name="Text">Содержимое</param>
|
||
record Page(int Id, int Number, string Text);
|
||
|
||
class PageContext : DbContext
|
||
{
|
||
public DbSet<Page> 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<Page> Pages;
|
||
BookStore bookStore;
|
||
|
||
public BookStoreProxy()
|
||
{
|
||
Pages = new List<Page>();
|
||
}
|
||
|
||
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;
|
||
}
|
||
}
|