diff --git a/BookShop/BookShop.sln b/BookShop/BookShop.sln
index aa65932..cbefac8 100644
--- a/BookShop/BookShop.sln
+++ b/BookShop/BookShop.sln
@@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33530.505
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BookShop", "BookShop\BookShop.csproj", "{946EC661-9CF9-43DA-9C97-A2CE481406D2}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BookShopView", "BookShopView\BookShopView.csproj", "{1455C2BC-5C22-4B93-8954-ACC01353BD24}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BookShopDataModels", "BookShopDataModels\BookShopDataModels.csproj", "{032BDFC0-6AAF-4A75-A9AE-B24C85A4679C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -11,15 +13,19 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {946EC661-9CF9-43DA-9C97-A2CE481406D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {946EC661-9CF9-43DA-9C97-A2CE481406D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {946EC661-9CF9-43DA-9C97-A2CE481406D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {946EC661-9CF9-43DA-9C97-A2CE481406D2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1455C2BC-5C22-4B93-8954-ACC01353BD24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1455C2BC-5C22-4B93-8954-ACC01353BD24}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1455C2BC-5C22-4B93-8954-ACC01353BD24}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1455C2BC-5C22-4B93-8954-ACC01353BD24}.Release|Any CPU.Build.0 = Release|Any CPU
+ {032BDFC0-6AAF-4A75-A9AE-B24C85A4679C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {032BDFC0-6AAF-4A75-A9AE-B24C85A4679C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {032BDFC0-6AAF-4A75-A9AE-B24C85A4679C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {032BDFC0-6AAF-4A75-A9AE-B24C85A4679C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {F2A3B3D2-EC41-4B24-B6F1-95D5692C7561}
+ SolutionGuid = {CC21F821-D99C-4781-AD62-0FA7B3BA0F82}
EndGlobalSection
EndGlobal
diff --git a/BookShop/BookShopBusinessLogic/BookShopBusinessLogic.csproj b/BookShop/BookShopBusinessLogic/BookShopBusinessLogic.csproj
new file mode 100644
index 0000000..132c02c
--- /dev/null
+++ b/BookShop/BookShopBusinessLogic/BookShopBusinessLogic.csproj
@@ -0,0 +1,9 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+
+
diff --git a/BookShop/BookShopBusinessLogic/BusinessLogics/AuthorLogic.cs b/BookShop/BookShopBusinessLogic/BusinessLogics/AuthorLogic.cs
new file mode 100644
index 0000000..6e90f84
--- /dev/null
+++ b/BookShop/BookShopBusinessLogic/BusinessLogics/AuthorLogic.cs
@@ -0,0 +1,116 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.BusinessLogicsContracts;
+using BookShopContracts.SearchModels;
+using BookShopContracts.StoragesContracts;
+using BookShopContracts.ViewModels;
+using Microsoft.Extensions.Logging;
+
+namespace BookShopBusinessLogic.BusinessLogics
+{
+ public class AuthorLogic : IAuthorLogic
+ {
+ private readonly ILogger _logger;
+
+ private readonly IAuthorStorage _authorStorage;
+
+ public AuthorLogic(ILogger logger, IAuthorStorage authorStorage)
+ {
+ _logger = logger;
+ _authorStorage = authorStorage;
+ }
+
+ public bool Create(AuthorBindingModel model)
+ {
+ CheckModel(model);
+ if (_authorStorage.Insert(model) == null)
+ {
+ _logger.LogWarning("Insert operation failed");
+ return false;
+ }
+ return true;
+ }
+
+ public bool Delete(AuthorBindingModel model)
+ {
+ CheckModel(model, false);
+ _logger.LogInformation("Delete. Id: {Id}", model.Id);
+ if (_authorStorage.Delete(model) == null)
+ {
+ _logger.LogWarning("Delete operation failed");
+ return false;
+ }
+ return true;
+ }
+
+ public AuthorViewModel? ReadElement(AuthorSearchModel model)
+ {
+ if (model == null)
+ {
+ throw new ArgumentNullException(nameof(model));
+ }
+ _logger.LogInformation("ReadElement. AuthorSurname: {AuthorSurname}. AuthorName: {AuthorName}. Id: {Id}.", model.AuthorSurname, model.AuthorName, model.Id);
+ var element = _authorStorage.GetElement(model);
+ if (element == null)
+ {
+ _logger.LogWarning("ReadElement element not found");
+ return null;
+ }
+ _logger.LogInformation("ReadElement find. Id: {Id}", element.Id);
+ return element;
+ }
+
+ public List? ReadList(AuthorSearchModel? model)
+ {
+ _logger.LogInformation("ReadList. AuthorSurname: {AuthorSurname}. AuthorName: {AuthorName}. Id: {Id}.", model?.AuthorSurname, model?.AuthorName, model?.Id);
+ var list = model == null ? _authorStorage.GetFullList() : _authorStorage.GetFilteredList(model);
+ if (list == null)
+ {
+ _logger.LogWarning("ReadList return null list");
+ return null;
+ }
+ _logger.LogInformation("ReadList. Count: {Count}", list.Count);
+ return list;
+ }
+
+ public bool Update(AuthorBindingModel model)
+ {
+ CheckModel(model);
+ if (_authorStorage.Update(model) == null)
+ {
+ _logger.LogWarning("Update operation failed");
+ return false;
+ }
+ return true;
+ }
+
+ private void CheckModel(AuthorBindingModel model, bool withParams = true)
+ {
+ if (model == null)
+ {
+ throw new ArgumentNullException(nameof(model));
+ }
+ if (!withParams)
+ {
+ return;
+ }
+ if (string.IsNullOrEmpty(model.AuthorSurname))
+ {
+ throw new ArgumentNullException("Нет фамилии клиента", nameof(model.AuthorSurname));
+ }
+ if (string.IsNullOrEmpty(model.AuthorName))
+ {
+ throw new ArgumentNullException("Нет имени клиента", nameof(model.AuthorName));
+ }
+ _logger.LogInformation("Author. AuthorSurname: {AuthorSurname}. AuthorName: {AuthorName}. AuthorPatronymic: {AuthorPatronymic}. Id: {Id}.", model.AuthorSurname, model.AuthorName, model.AuthorPatronymic, model.Id);
+ var element = _authorStorage.GetElement(new AuthorSearchModel
+ {
+ AuthorSurname = model.AuthorSurname,
+ AuthorName = model.AuthorName
+ });
+ if (element != null && element.Id != model.Id)
+ {
+ throw new InvalidOperationException("Автор с таким ФИО уже есть");
+ }
+ }
+ }
+}
diff --git a/BookShop/BookShopBusinessLogic/BusinessLogics/BookLogic.cs b/BookShop/BookShopBusinessLogic/BusinessLogics/BookLogic.cs
new file mode 100644
index 0000000..cfa2ec9
--- /dev/null
+++ b/BookShop/BookShopBusinessLogic/BusinessLogics/BookLogic.cs
@@ -0,0 +1,129 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.BusinessLogicsContracts;
+using BookShopContracts.SearchModels;
+using BookShopContracts.StoragesContracts;
+using BookShopContracts.ViewModels;
+using Microsoft.Extensions.Logging;
+
+namespace BookShopBusinessLogic.BusinessLogics
+{
+ public class BookLogic : IBookLogic
+ {
+ private readonly ILogger _logger;
+
+ private readonly IBookStorage _bookStorage;
+
+ public BookLogic(ILogger logger, IBookStorage bookStorage)
+ {
+ _logger = logger;
+ _bookStorage = bookStorage;
+ }
+
+ public bool Create(BookBindingModel model)
+ {
+ CheckModel(model);
+ if (_bookStorage.Insert(model) == null)
+ {
+ _logger.LogWarning("Insert operation failed");
+ return false;
+ }
+ return true;
+ }
+
+ public bool Delete(BookBindingModel model)
+ {
+ CheckModel(model, false);
+ _logger.LogInformation("Delete. Id: {Id}", model.Id);
+ if (_bookStorage.Delete(model) == null)
+ {
+ _logger.LogWarning("Delete operation failed");
+ return false;
+ }
+ return true;
+ }
+
+ public BookViewModel? ReadElement(BookSearchModel model)
+ {
+ if (model == null)
+ {
+ throw new ArgumentNullException(nameof(model));
+ }
+ _logger.LogInformation("ReadElement. BookName: {BookName}. Id: {Id}.", model.BookName, model.Id);
+ var element = _bookStorage.GetElement(model);
+ if (element == null)
+ {
+ _logger.LogWarning("ReadElement element not found");
+ return null;
+ }
+ _logger.LogInformation("ReadElement find. Id: {Id}", element.Id);
+ return element;
+ }
+
+ public List? ReadList(BookSearchModel? model)
+ {
+ _logger.LogInformation("ReadList. BookName: {BookName}. Id: {Id}.", model?.BookName, model?.Id);
+ var list = model == null ? _bookStorage.GetFullList() : _bookStorage.GetFilteredList(model);
+ if (list == null)
+ {
+ _logger.LogWarning("ReadList return null list");
+ return null;
+ }
+ _logger.LogInformation("ReadList. Count: {Count}", list.Count);
+ return list;
+ }
+
+ public string TestInsertList(int num)
+ {
+ throw new NotImplementedException();
+ }
+
+ public string TestReadList(int num)
+ {
+ return _bookStorage.TestReadList(num);
+ }
+
+ public bool Update(BookBindingModel model)
+ {
+ CheckModel(model);
+ if (_bookStorage.Update(model) == null)
+ {
+ _logger.LogWarning("Update operation failed");
+ return false;
+ }
+ return true;
+ }
+
+ private void CheckModel(BookBindingModel model, bool withParams = true)
+ {
+ if (model == null)
+ {
+ throw new ArgumentNullException(nameof(model));
+ }
+ if (!withParams)
+ {
+ return;
+ }
+ if (string.IsNullOrEmpty(model.BookName))
+ {
+ throw new ArgumentNullException("Нет названия книги", nameof(model.BookName));
+ }
+ if (model.Count < 0)
+ {
+ throw new ArgumentNullException("Количество не может быть меньше 0", nameof(model.BookName));
+ }
+ if (model.Cost <= 0)
+ {
+ throw new ArgumentNullException("Стоимость не может быть меньше 0", nameof(model.BookName));
+ }
+ _logger.LogInformation("Book. BookName: {BookName}. Cost: {Cost}. Id: {Id}.", model.BookName, model.Cost, model.Id);
+ var element = _bookStorage.GetElement(new BookSearchModel
+ {
+ BookName = model.BookName
+ });
+ if (element != null && element.Id != model.Id)
+ {
+ throw new InvalidOperationException("Книга с таким названием уже есть");
+ }
+ }
+ }
+}
diff --git a/BookShop/BookShopBusinessLogic/BusinessLogics/ClientLogic.cs b/BookShop/BookShopBusinessLogic/BusinessLogics/ClientLogic.cs
new file mode 100644
index 0000000..aa17753
--- /dev/null
+++ b/BookShop/BookShopBusinessLogic/BusinessLogics/ClientLogic.cs
@@ -0,0 +1,119 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.BusinessLogicsContracts;
+using BookShopContracts.SearchModels;
+using BookShopContracts.StoragesContracts;
+using BookShopContracts.ViewModels;
+using Microsoft.Extensions.Logging;
+
+namespace BookShopBusinessLogic.BusinessLogics
+{
+ public class ClientLogic : IClientLogic
+ {
+ private readonly ILogger _logger;
+
+ private readonly IClientStorage _clientStorage;
+
+ public ClientLogic(ILogger logger, IClientStorage clientStorage)
+ {
+ _logger = logger;
+ _clientStorage = clientStorage;
+ }
+
+ public bool Create(ClientBindingModel model)
+ {
+ CheckModel(model);
+ if (_clientStorage.Insert(model) == null)
+ {
+ _logger.LogWarning("Insert operation failed");
+ return false;
+ }
+ return true;
+ }
+
+ public bool Delete(ClientBindingModel model)
+ {
+ CheckModel(model, false);
+ _logger.LogInformation("Delete. Id: {Id}", model.Id);
+ if (_clientStorage.Delete(model) == null)
+ {
+ _logger.LogWarning("Delete operation failed");
+ return false;
+ }
+ return true;
+ }
+
+ public ClientViewModel? ReadElement(ClientSearchModel model)
+ {
+ if (model == null)
+ {
+ throw new ArgumentNullException(nameof(model));
+ }
+ _logger.LogInformation("ReadElement. ClientSurname: {ClientSurname}. ClientName: {ClientName}. ClientPatronymic: {ClientPatronymic}. Email: {Email}. Id: {Id}.", model.ClientSurname, model.ClientName, model.ClientPatronymic, model.Email, model.Id);
+ var element = _clientStorage.GetElement(model);
+ if (element == null)
+ {
+ _logger.LogWarning("ReadElement element not found");
+ return null;
+ }
+ _logger.LogInformation("ReadElement find. Id: {Id}", element.Id);
+ return element;
+ }
+
+ public List? ReadList(ClientSearchModel? model)
+ {
+ _logger.LogInformation("ReadList. ClientSurname: {ClientSurname}. ClientName: {ClientName}. ClientPatronymic: {ClientPatronymic}. Email: {Email}. Id: {Id}.", model?.ClientSurname, model?.ClientName, model?.ClientPatronymic, model?.Email, model?.Id);
+ var list = model == null ? _clientStorage.GetFullList() : _clientStorage.GetFilteredList(model);
+ if (list == null)
+ {
+ _logger.LogWarning("ReadList return null list");
+ return null;
+ }
+ _logger.LogInformation("ReadList. Count: {Count}", list.Count);
+ return list;
+ }
+
+ public bool Update(ClientBindingModel model)
+ {
+ CheckModel(model);
+ if (_clientStorage.Update(model) == null)
+ {
+ _logger.LogWarning("Update operation failed");
+ return false;
+ }
+ return true;
+ }
+
+ private void CheckModel(ClientBindingModel model, bool withParams = true)
+ {
+ if (model == null)
+ {
+ throw new ArgumentNullException(nameof(model));
+ }
+ if (!withParams)
+ {
+ return;
+ }
+ if (string.IsNullOrEmpty(model.ClientSurname))
+ {
+ throw new ArgumentNullException("Нет фамилии клиента", nameof(model.ClientSurname));
+ }
+ if (string.IsNullOrEmpty(model.ClientName))
+ {
+ throw new ArgumentNullException("Нет имени клиента", nameof(model.ClientName));
+ }
+ if (string.IsNullOrEmpty(model.Email))
+ {
+ throw new ArgumentNullException("Нет почты клиента", nameof(model.Email));
+ }
+ _logger.LogInformation("Client. ClientSurname: {ClientSurname}. ClientName: {ClientName}. ClientPatronymic: {ClientPatronymic}. Email: {Email}. Id: {Id}.", model.ClientSurname, model.ClientName, model.ClientPatronymic, model.Email, model.Id);
+ var element = _clientStorage.GetElement(new ClientSearchModel
+ {
+ Email = model.Email
+ });
+ if (element != null && element.Id != model.Id)
+ {
+ throw new InvalidOperationException("Клиент с такой почтой уже есть");
+ }
+ }
+ }
+}
diff --git a/BookShop/BookShopBusinessLogic/BusinessLogics/GenreLogic.cs b/BookShop/BookShopBusinessLogic/BusinessLogics/GenreLogic.cs
new file mode 100644
index 0000000..2fa7d78
--- /dev/null
+++ b/BookShop/BookShopBusinessLogic/BusinessLogics/GenreLogic.cs
@@ -0,0 +1,111 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.BusinessLogicsContracts;
+using BookShopContracts.SearchModels;
+using BookShopContracts.StoragesContracts;
+using BookShopContracts.ViewModels;
+using BookShopDataModels.Models;
+using Microsoft.Extensions.Logging;
+
+namespace BookShopBusinessLogic.BusinessLogics
+{
+ public class GenreLogic : IGenreLogic
+ {
+ private readonly ILogger _logger;
+
+ private readonly IGenreStorage _genreStorage;
+ public GenreLogic(ILogger logger, IGenreStorage genreStorage)
+ {
+ _logger = logger;
+ _genreStorage = genreStorage;
+ }
+
+ public bool Create(GenreBindingModel model)
+ {
+ CheckModel(model);
+ if (_genreStorage.Insert(model) == null)
+ {
+ _logger.LogWarning("Insert operation failed");
+ return false;
+ }
+ return true;
+ }
+
+ public bool Delete(GenreBindingModel model)
+ {
+ CheckModel(model, false);
+ _logger.LogInformation("Delete. Id: {Id}", model.Id);
+ if (_genreStorage.Delete(model) == null)
+ {
+ _logger.LogWarning("Delete operation failed");
+ return false;
+ }
+ return true;
+ }
+
+ public GenreViewModel? ReadElement(GenreSearchModel model)
+ {
+ if (model == null)
+ {
+ throw new ArgumentNullException(nameof(model));
+ }
+ _logger.LogInformation("ReadElement. GenreName: {GenreName}. Id: {Id}.", model.GenreName, model.Id);
+ var element = _genreStorage.GetElement(model);
+ if (element == null)
+ {
+ _logger.LogWarning("ReadElement element not found");
+ return null;
+ }
+ _logger.LogInformation("ReadElement find. Id: {Id}", element.Id);
+ return element;
+ }
+
+ public List? ReadList(GenreSearchModel? model)
+ {
+ _logger.LogInformation("ReadList. GenreName: {GenreName}. Id: {Id}.", model?.GenreName, model?.Id);
+ var list = model == null ? _genreStorage.GetFullList() : _genreStorage.GetFilteredList(model);
+ if (list == null)
+ {
+ _logger.LogWarning("ReadList return null list");
+ return null;
+ }
+ _logger.LogInformation("ReadList. Count: {Count}", list.Count);
+ return list;
+ }
+
+ public bool Update(GenreBindingModel model)
+ {
+ CheckModel(model);
+ if (_genreStorage.Update(model) == null)
+ {
+ _logger.LogWarning("Update operation failed");
+ return false;
+ }
+ return true;
+ }
+
+ private void CheckModel(GenreBindingModel model, bool withParams = true)
+ {
+ if (model == null)
+ {
+ throw new ArgumentNullException(nameof(model));
+ }
+ if (!withParams)
+ {
+ return;
+ }
+ if (string.IsNullOrEmpty(model.GenreName))
+ {
+ throw new ArgumentNullException("Нет названия жанра", nameof(model.GenreName));
+ }
+ _logger.LogInformation("Genre. GenreName: {GenreName}. Id: {Id}.", model.GenreName, model.Id);
+ var element = _genreStorage.GetElement(new GenreSearchModel
+ {
+ GenreName = model.GenreName
+ });
+ if (element != null && element.Id != model.Id)
+ {
+ throw new InvalidOperationException("Такой жанр уже есть");
+ }
+ }
+ }
+}
diff --git a/BookShop/BookShopBusinessLogic/BusinessLogics/OrderLogic.cs b/BookShop/BookShopBusinessLogic/BusinessLogics/OrderLogic.cs
new file mode 100644
index 0000000..b3c3c20
--- /dev/null
+++ b/BookShop/BookShopBusinessLogic/BusinessLogics/OrderLogic.cs
@@ -0,0 +1,102 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.BusinessLogicsContracts;
+using BookShopContracts.SearchModels;
+using BookShopContracts.StoragesContracts;
+using BookShopContracts.ViewModels;
+using Microsoft.Extensions.Logging;
+
+namespace BookShopBusinessLogic.BusinessLogics
+{
+ public class OrderLogic : IOrderLogic
+ {
+ private readonly ILogger _logger;
+
+ private readonly IOrderStorage _orderStorage;
+
+ public OrderLogic(ILogger logger, IOrderStorage orderStorage)
+ {
+ _logger = logger;
+ _orderStorage = orderStorage;
+ }
+
+ public bool Create(OrderBindingModel model)
+ {
+ CheckModel(model);
+
+ if (_orderStorage.Insert(model) == null)
+ {
+ _logger.LogWarning("Insert operation failed");
+ return false;
+ }
+
+ return true;
+ }
+
+ public List? ReadList(OrderSearchModel? model)
+ {
+ _logger.LogInformation("Order. OrderId:{Id}", model?.Id);
+
+ var list = model == null ? _orderStorage.GetFullList() : _orderStorage.GetFilteredList(model);
+
+ if (list == null)
+ {
+ _logger.LogWarning("ReadList return null list");
+ return null;
+ }
+
+ _logger.LogInformation("ReadList. Count:{Count}", list.Count);
+ return list;
+ }
+
+ private void CheckModel(OrderBindingModel model, bool withParams = true)
+ {
+ if (model == null)
+ {
+ throw new ArgumentNullException(nameof(model));
+ }
+ if (!withParams)
+ {
+ return;
+ }
+
+ if (model.BookId < 0)
+ {
+ throw new ArgumentNullException("Некорректный идентификатор книги", nameof(model.BookId));
+ }
+
+ if (model.Count <= 0)
+ {
+ throw new ArgumentNullException("Количество книг в заказе должно быть больше 0", nameof(model.Count));
+ }
+ if (model.Sum <= 0)
+ {
+ throw new ArgumentNullException("Сумма заказа должна быть больше 0", nameof(model.Sum));
+ }
+
+ _logger.LogInformation("Order. OrderId:{Id}.Sum:{ Sum}. Id: { BookId}", model.Id, model.Sum, model.BookId);
+ }
+
+ public OrderViewModel? ReadElement(OrderSearchModel model)
+ {
+ if (model == null)
+ {
+ throw new ArgumentNullException(nameof(model));
+ }
+
+ _logger.LogInformation("ReadElement. Id:{ Id}", model.Id);
+
+ var element = _orderStorage.GetElement(model);
+
+ if (element == null)
+ {
+ _logger.LogWarning("ReadElement element not found");
+
+ return null;
+ }
+
+ _logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
+
+ return element;
+ }
+ }
+}
diff --git a/BookShop/BookShopContracts/BindingModels/AuthorBindingModel.cs b/BookShop/BookShopContracts/BindingModels/AuthorBindingModel.cs
new file mode 100644
index 0000000..3852329
--- /dev/null
+++ b/BookShop/BookShopContracts/BindingModels/AuthorBindingModel.cs
@@ -0,0 +1,15 @@
+using BookShopDataModels.Models;
+
+namespace BookShopContracts.BindingModels
+{
+ public class AuthorBindingModel : IAuthorModel
+ {
+ public int Id { get; set; }
+
+ public string AuthorSurname { get; set; } = string.Empty;
+
+ public string AuthorName { get; set; } = string.Empty;
+
+ public string AuthorPatronymic { get; set; } = string.Empty;
+ }
+}
diff --git a/BookShop/BookShopContracts/BindingModels/BookBindingModel.cs b/BookShop/BookShopContracts/BindingModels/BookBindingModel.cs
new file mode 100644
index 0000000..46ac549
--- /dev/null
+++ b/BookShop/BookShopContracts/BindingModels/BookBindingModel.cs
@@ -0,0 +1,28 @@
+using BookShopDataModels.Models;
+using System.ComponentModel;
+
+namespace BookShopContracts.BindingModels
+{
+ public class BookBindingModel : IBookModel
+ {
+ public int Id { get; set; }
+ [DisplayName("Название")]
+
+ public string BookName { get; set; } = string.Empty;
+ [DisplayName("Стоимость")]
+
+ public double Cost { get; set; }
+ [DisplayName("Количество")]
+
+ public int Count { get; set; }
+ [DisplayName("Жанр")]
+
+ public int GenreId { get; set; }
+
+ public Dictionary BookAuthors
+ {
+ get;
+ set;
+ } = new();
+ }
+}
diff --git a/BookShop/BookShopContracts/BindingModels/ClientBindingModel.cs b/BookShop/BookShopContracts/BindingModels/ClientBindingModel.cs
new file mode 100644
index 0000000..0511f11
--- /dev/null
+++ b/BookShop/BookShopContracts/BindingModels/ClientBindingModel.cs
@@ -0,0 +1,18 @@
+using BookShopDataModels.Models;
+
+namespace BookShopContracts.BindingModels
+{
+ public class ClientBindingModel : IClientModel
+ {
+ public int Id { get; set; }
+
+ public string ClientSurname { get; set; } = string.Empty;
+
+ public string ClientName { get; set; } = string.Empty;
+
+ public string ClientPatronymic { get; set; } = string.Empty;
+
+ public string Email { get; set; } = string.Empty;
+
+ }
+}
diff --git a/BookShop/BookShopContracts/BindingModels/GenreBindingModel.cs b/BookShop/BookShopContracts/BindingModels/GenreBindingModel.cs
new file mode 100644
index 0000000..cfbe329
--- /dev/null
+++ b/BookShop/BookShopContracts/BindingModels/GenreBindingModel.cs
@@ -0,0 +1,11 @@
+using BookShopDataModels.Models;
+
+namespace BookShopContracts.BindingModels
+{
+ public class GenreBindingModel : IGenreModel
+ {
+ public int Id { get; set; }
+
+ public string GenreName { get; set; } = string.Empty;
+ }
+}
diff --git a/BookShop/BookShopContracts/BindingModels/OrderBindingModel.cs b/BookShop/BookShopContracts/BindingModels/OrderBindingModel.cs
new file mode 100644
index 0000000..781cafc
--- /dev/null
+++ b/BookShop/BookShopContracts/BindingModels/OrderBindingModel.cs
@@ -0,0 +1,23 @@
+using BookShopDataModels.Models;
+
+namespace BookShopContracts.BindingModels
+{
+ public class OrderBindingModel : IOrderModel
+ {
+ public int Id { get; set; }
+
+ public int BookId { get; set; }
+
+ public string BookName { get; set; } = string.Empty;
+
+ public int ClientId { get; set; }
+
+ public string ClientName { get; set; } = string.Empty;
+
+ public int Count { get; set; }
+
+ public double Sum { get; set; }
+
+ public DateTime DateCreate { get; set; } = DateTime.Now;
+ }
+}
diff --git a/BookShop/BookShopContracts/BookShopContracts.csproj b/BookShop/BookShopContracts/BookShopContracts.csproj
new file mode 100644
index 0000000..132c02c
--- /dev/null
+++ b/BookShop/BookShopContracts/BookShopContracts.csproj
@@ -0,0 +1,9 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+
+
diff --git a/BookShop/BookShopContracts/BusinessLogicsContracts/IAuthorLogic.cs b/BookShop/BookShopContracts/BusinessLogicsContracts/IAuthorLogic.cs
new file mode 100644
index 0000000..954b9e9
--- /dev/null
+++ b/BookShop/BookShopContracts/BusinessLogicsContracts/IAuthorLogic.cs
@@ -0,0 +1,19 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.SearchModels;
+using BookShopContracts.ViewModels;
+
+namespace BookShopContracts.BusinessLogicsContracts
+{
+ public interface IAuthorLogic
+ {
+ List? ReadList(AuthorSearchModel? model);
+
+ AuthorViewModel? ReadElement(AuthorSearchModel model);
+
+ bool Create(AuthorBindingModel model);
+
+ bool Update(AuthorBindingModel model);
+
+ bool Delete(AuthorBindingModel model);
+ }
+}
diff --git a/BookShop/BookShopContracts/BusinessLogicsContracts/IBookLogic.cs b/BookShop/BookShopContracts/BusinessLogicsContracts/IBookLogic.cs
new file mode 100644
index 0000000..3122f0a
--- /dev/null
+++ b/BookShop/BookShopContracts/BusinessLogicsContracts/IBookLogic.cs
@@ -0,0 +1,23 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.SearchModels;
+using BookShopContracts.ViewModels;
+
+namespace BookShopContracts.BusinessLogicsContracts
+{
+ public interface IBookLogic
+ {
+ List? ReadList(BookSearchModel? model);
+
+ BookViewModel? ReadElement(BookSearchModel model);
+
+ bool Create(BookBindingModel model);
+
+ bool Update(BookBindingModel model);
+
+ bool Delete(BookBindingModel model);
+
+ string TestInsertList(int num);
+
+ string TestReadList(int num);
+ }
+}
diff --git a/BookShop/BookShopContracts/BusinessLogicsContracts/IClientLogic.cs b/BookShop/BookShopContracts/BusinessLogicsContracts/IClientLogic.cs
new file mode 100644
index 0000000..79f00f8
--- /dev/null
+++ b/BookShop/BookShopContracts/BusinessLogicsContracts/IClientLogic.cs
@@ -0,0 +1,19 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.SearchModels;
+using BookShopContracts.ViewModels;
+
+namespace BookShopContracts.BusinessLogicsContracts
+{
+ public interface IClientLogic
+ {
+ List? ReadList(ClientSearchModel? model);
+
+ ClientViewModel? ReadElement(ClientSearchModel model);
+
+ bool Create(ClientBindingModel model);
+
+ bool Update(ClientBindingModel model);
+
+ bool Delete(ClientBindingModel model);
+ }
+}
diff --git a/BookShop/BookShopContracts/BusinessLogicsContracts/IGenreLogic.cs b/BookShop/BookShopContracts/BusinessLogicsContracts/IGenreLogic.cs
new file mode 100644
index 0000000..d4e65ee
--- /dev/null
+++ b/BookShop/BookShopContracts/BusinessLogicsContracts/IGenreLogic.cs
@@ -0,0 +1,19 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.SearchModels;
+using BookShopContracts.ViewModels;
+
+namespace BookShopContracts.BusinessLogicsContracts
+{
+ public interface IGenreLogic
+ {
+ List? ReadList(GenreSearchModel? model);
+
+ GenreViewModel? ReadElement(GenreSearchModel model);
+
+ bool Create(GenreBindingModel model);
+
+ bool Update(GenreBindingModel model);
+
+ bool Delete(GenreBindingModel model);
+ }
+}
diff --git a/BookShop/BookShopContracts/BusinessLogicsContracts/IOrderLogic.cs b/BookShop/BookShopContracts/BusinessLogicsContracts/IOrderLogic.cs
new file mode 100644
index 0000000..e3c01e3
--- /dev/null
+++ b/BookShop/BookShopContracts/BusinessLogicsContracts/IOrderLogic.cs
@@ -0,0 +1,15 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.SearchModels;
+using BookShopContracts.ViewModels;
+
+namespace BookShopContracts.BusinessLogicsContracts
+{
+ public interface IOrderLogic
+ {
+ List? ReadList(OrderSearchModel? model);
+
+ OrderViewModel? ReadElement(OrderSearchModel model);
+
+ bool Create(OrderBindingModel model);
+ }
+}
diff --git a/BookShop/BookShopContracts/SearchModels/AuthorSearchModel.cs b/BookShop/BookShopContracts/SearchModels/AuthorSearchModel.cs
new file mode 100644
index 0000000..2f68560
--- /dev/null
+++ b/BookShop/BookShopContracts/SearchModels/AuthorSearchModel.cs
@@ -0,0 +1,11 @@
+namespace BookShopContracts.SearchModels
+{
+ public class AuthorSearchModel
+ {
+ public int? Id { get; set; }
+
+ public string? AuthorSurname { get; set; }
+
+ public string? AuthorName { get; set; }
+ }
+}
diff --git a/BookShop/BookShopContracts/SearchModels/BookSearchModel.cs b/BookShop/BookShopContracts/SearchModels/BookSearchModel.cs
new file mode 100644
index 0000000..cb59529
--- /dev/null
+++ b/BookShop/BookShopContracts/SearchModels/BookSearchModel.cs
@@ -0,0 +1,9 @@
+namespace BookShopContracts.SearchModels
+{
+ public class BookSearchModel
+ {
+ public int? Id { get; set; }
+
+ public string? BookName { get; set; }
+ }
+}
diff --git a/BookShop/BookShopContracts/SearchModels/ClientSearchModel.cs b/BookShop/BookShopContracts/SearchModels/ClientSearchModel.cs
new file mode 100644
index 0000000..290cb22
--- /dev/null
+++ b/BookShop/BookShopContracts/SearchModels/ClientSearchModel.cs
@@ -0,0 +1,15 @@
+namespace BookShopContracts.SearchModels
+{
+ public class ClientSearchModel
+ {
+ public int? Id { get; set; }
+
+ public string? ClientSurname { get; set; }
+
+ public string? ClientName { get; set; }
+
+ public string? ClientPatronymic { get; set; }
+
+ public string? Email { get; set; }
+ }
+}
diff --git a/BookShop/BookShopContracts/SearchModels/GenreSearchModel.cs b/BookShop/BookShopContracts/SearchModels/GenreSearchModel.cs
new file mode 100644
index 0000000..8fa1747
--- /dev/null
+++ b/BookShop/BookShopContracts/SearchModels/GenreSearchModel.cs
@@ -0,0 +1,9 @@
+namespace BookShopContracts.SearchModels
+{
+ public class GenreSearchModel
+ {
+ public int? Id { get; set; }
+
+ public string? GenreName { get; set; }
+ }
+}
diff --git a/BookShop/BookShopContracts/SearchModels/OrderSearchModel.cs b/BookShop/BookShopContracts/SearchModels/OrderSearchModel.cs
new file mode 100644
index 0000000..15e39c8
--- /dev/null
+++ b/BookShop/BookShopContracts/SearchModels/OrderSearchModel.cs
@@ -0,0 +1,11 @@
+namespace BookShopContracts.SearchModels
+{
+ public class OrderSearchModel
+ {
+ public int? Id { get; set; }
+
+ public int? ClientId { get; set; }
+
+ public DateTime? DateCreate { get; set; }
+ }
+}
diff --git a/BookShop/BookShopContracts/StoragesContracts/IAuthorStorage.cs b/BookShop/BookShopContracts/StoragesContracts/IAuthorStorage.cs
new file mode 100644
index 0000000..35086b7
--- /dev/null
+++ b/BookShop/BookShopContracts/StoragesContracts/IAuthorStorage.cs
@@ -0,0 +1,21 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.SearchModels;
+using BookShopContracts.ViewModels;
+
+namespace BookShopContracts.StoragesContracts
+{
+ public interface IAuthorStorage
+ {
+ List GetFullList();
+
+ List GetFilteredList(AuthorSearchModel model);
+
+ AuthorViewModel? GetElement(AuthorSearchModel model);
+
+ AuthorViewModel? Insert(AuthorBindingModel model);
+
+ AuthorViewModel? Update(AuthorBindingModel model);
+
+ AuthorViewModel? Delete(AuthorBindingModel model);
+ }
+}
diff --git a/BookShop/BookShopContracts/StoragesContracts/IBookStorage.cs b/BookShop/BookShopContracts/StoragesContracts/IBookStorage.cs
new file mode 100644
index 0000000..aba342f
--- /dev/null
+++ b/BookShop/BookShopContracts/StoragesContracts/IBookStorage.cs
@@ -0,0 +1,25 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.SearchModels;
+using BookShopContracts.ViewModels;
+
+namespace BookShopContracts.StoragesContracts
+{
+ public interface IBookStorage
+ {
+ List GetFullList();
+
+ List GetFilteredList(BookSearchModel model);
+
+ BookViewModel? GetElement(BookSearchModel model);
+
+ BookViewModel? Insert(BookBindingModel model);
+
+ BookViewModel? Update(BookBindingModel model);
+
+ BookViewModel? Delete(BookBindingModel model);
+
+ string TestInsertList(int num);
+
+ string TestReadList(int num);
+ }
+}
diff --git a/BookShop/BookShopContracts/StoragesContracts/IClientStorage.cs b/BookShop/BookShopContracts/StoragesContracts/IClientStorage.cs
new file mode 100644
index 0000000..209ba24
--- /dev/null
+++ b/BookShop/BookShopContracts/StoragesContracts/IClientStorage.cs
@@ -0,0 +1,21 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.SearchModels;
+using BookShopContracts.ViewModels;
+
+namespace BookShopContracts.StoragesContracts
+{
+ public interface IClientStorage
+ {
+ List GetFullList();
+
+ List GetFilteredList(ClientSearchModel model);
+
+ ClientViewModel? GetElement(ClientSearchModel model);
+
+ ClientViewModel? Insert(ClientBindingModel model);
+
+ ClientViewModel? Update(ClientBindingModel model);
+
+ ClientViewModel? Delete(ClientBindingModel model);
+ }
+}
diff --git a/BookShop/BookShopContracts/StoragesContracts/IGenreStorage.cs b/BookShop/BookShopContracts/StoragesContracts/IGenreStorage.cs
new file mode 100644
index 0000000..93b6a2c
--- /dev/null
+++ b/BookShop/BookShopContracts/StoragesContracts/IGenreStorage.cs
@@ -0,0 +1,21 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.SearchModels;
+using BookShopContracts.ViewModels;
+
+namespace BookShopContracts.StoragesContracts
+{
+ public interface IGenreStorage
+ {
+ List GetFullList();
+
+ List GetFilteredList(GenreSearchModel model);
+
+ GenreViewModel? GetElement(GenreSearchModel model);
+
+ GenreViewModel? Insert(GenreBindingModel model);
+
+ GenreViewModel? Update(GenreBindingModel model);
+
+ GenreViewModel? Delete(GenreBindingModel model);
+ }
+}
diff --git a/BookShop/BookShopContracts/StoragesContracts/IOrderStorage.cs b/BookShop/BookShopContracts/StoragesContracts/IOrderStorage.cs
new file mode 100644
index 0000000..dfb05d5
--- /dev/null
+++ b/BookShop/BookShopContracts/StoragesContracts/IOrderStorage.cs
@@ -0,0 +1,17 @@
+using BookShopContracts.BindingModels;
+using BookShopContracts.SearchModels;
+using BookShopContracts.ViewModels;
+
+namespace BookShopContracts.StoragesContracts
+{
+ public interface IOrderStorage
+ {
+ List GetFullList();
+
+ List GetFilteredList(OrderSearchModel model);
+
+ OrderViewModel? GetElement(OrderSearchModel model);
+
+ OrderViewModel? Insert(OrderBindingModel model);
+ }
+}
diff --git a/BookShop/BookShopContracts/ViewModels/AuthorViewModel.cs b/BookShop/BookShopContracts/ViewModels/AuthorViewModel.cs
new file mode 100644
index 0000000..831e81b
--- /dev/null
+++ b/BookShop/BookShopContracts/ViewModels/AuthorViewModel.cs
@@ -0,0 +1,19 @@
+using BookShopDataModels.Models;
+using System.ComponentModel;
+
+namespace BookShopContracts.ViewModels
+{
+ public class AuthorViewModel: IAuthorModel
+ {
+ public int Id { get; set; }
+ [DisplayName("Фамилия автора")]
+
+ public string AuthorSurname { get; set; } = string.Empty;
+ [DisplayName("Имя автора")]
+
+ public string AuthorName { get; set; } = string.Empty;
+ [DisplayName("Отчество автора")]
+
+ public string AuthorPatronymic { get; set; } = string.Empty;
+ }
+}
diff --git a/BookShop/BookShopContracts/ViewModels/BookViewModel.cs b/BookShop/BookShopContracts/ViewModels/BookViewModel.cs
new file mode 100644
index 0000000..18402c6
--- /dev/null
+++ b/BookShop/BookShopContracts/ViewModels/BookViewModel.cs
@@ -0,0 +1,24 @@
+using BookShopDataModels.Models;
+using System.ComponentModel;
+
+namespace BookShopContracts.ViewModels
+{
+ public class BookViewModel: IBookModel
+ {
+ public int Id { get; set; }
+ [DisplayName("Название")]
+
+ public string BookName { get; set; } = string.Empty;
+ [DisplayName("Стоимость")]
+
+ public double Cost { get; set; }
+
+ public int Count { get; set; }
+
+ public int GenreId { get; set; }
+
+ public string GenreName { get; set; } = string.Empty;
+
+ public Dictionary BookAuthors { get; set; } = new();
+ }
+}
diff --git a/BookShop/BookShopContracts/ViewModels/ClientViewModel.cs b/BookShop/BookShopContracts/ViewModels/ClientViewModel.cs
new file mode 100644
index 0000000..3c27a74
--- /dev/null
+++ b/BookShop/BookShopContracts/ViewModels/ClientViewModel.cs
@@ -0,0 +1,23 @@
+using BookShopContracts.BusinessLogicsContracts;
+using BookShopDataModels.Models;
+using System.ComponentModel;
+
+namespace BookShopContracts.ViewModels
+{
+ public class ClientViewModel: IClientModel
+ {
+ public int Id { get; set; }
+ [DisplayName("Фамилия клиента")]
+
+ public string ClientSurname { get; set; } = string.Empty;
+ [DisplayName("Имя клиента")]
+
+ public string ClientName { get; set; } = string.Empty;
+ [DisplayName("Отчество клиента")]
+
+ public string ClientPatronymic { get; set; } = string.Empty;
+ [DisplayName("Электронная почта клиента")]
+
+ public string Email { get; set; } = string.Empty;
+ }
+}
diff --git a/BookShop/BookShopContracts/ViewModels/GenreViewModel.cs b/BookShop/BookShopContracts/ViewModels/GenreViewModel.cs
new file mode 100644
index 0000000..575b225
--- /dev/null
+++ b/BookShop/BookShopContracts/ViewModels/GenreViewModel.cs
@@ -0,0 +1,13 @@
+using BookShopDataModels.Models;
+using System.ComponentModel;
+
+namespace BookShopContracts.ViewModels
+{
+ public class GenreViewModel: IGenreModel
+ {
+ public int Id { get; set; }
+ [DisplayName("Жанр")]
+
+ public string GenreName { get; set; } = string.Empty;
+ }
+}
diff --git a/BookShop/BookShopContracts/ViewModels/OrderViewModel.cs b/BookShop/BookShopContracts/ViewModels/OrderViewModel.cs
new file mode 100644
index 0000000..c521531
--- /dev/null
+++ b/BookShop/BookShopContracts/ViewModels/OrderViewModel.cs
@@ -0,0 +1,29 @@
+using BookShopDataModels.Models;
+using System.ComponentModel;
+
+namespace BookShopContracts.ViewModels
+{
+ public class OrderViewModel: IOrderModel
+ {
+ public int Id { get; set; }
+
+ public int BookId { get; set; }
+ [DisplayName("Название книги")]
+
+ public string BookName { get; set; } = string.Empty;
+
+ public int ClientId { get; set; }
+ [DisplayName("Фамилия клиента")]
+
+ public string ClientSurname {get; set; } = string.Empty;
+ [DisplayName("Количество")]
+
+ public int Count { get; set; }
+ [DisplayName("Сумма")]
+
+ public double Sum { get; set; }
+ [DisplayName("Дата заказа")]
+
+ public DateTime DateCreate { get; set; } = DateTime.Now;
+ }
+}
diff --git a/BookShop/BookShopDataModels/BookShopDataModels.csproj b/BookShop/BookShopDataModels/BookShopDataModels.csproj
new file mode 100644
index 0000000..132c02c
--- /dev/null
+++ b/BookShop/BookShopDataModels/BookShopDataModels.csproj
@@ -0,0 +1,9 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+
+
diff --git a/BookShop/BookShopDataModels/IId.cs b/BookShop/BookShopDataModels/IId.cs
new file mode 100644
index 0000000..17dbe0d
--- /dev/null
+++ b/BookShop/BookShopDataModels/IId.cs
@@ -0,0 +1,7 @@
+namespace BookShopDataModels
+{
+ public interface IId
+ {
+ int Id { get; }
+ }
+}
diff --git a/BookShop/BookShopDataModels/Models/IAuthorModel.cs b/BookShop/BookShopDataModels/Models/IAuthorModel.cs
new file mode 100644
index 0000000..19a6209
--- /dev/null
+++ b/BookShop/BookShopDataModels/Models/IAuthorModel.cs
@@ -0,0 +1,11 @@
+namespace BookShopDataModels.Models
+{
+ public interface IAuthorModel: IId
+ {
+ string AuthorSurname { get; }
+
+ string AuthorName { get; }
+
+ string AuthorPatronymic { get; }
+ }
+}
diff --git a/BookShop/BookShopDataModels/Models/IBookModel.cs b/BookShop/BookShopDataModels/Models/IBookModel.cs
new file mode 100644
index 0000000..8936b28
--- /dev/null
+++ b/BookShop/BookShopDataModels/Models/IBookModel.cs
@@ -0,0 +1,15 @@
+namespace BookShopDataModels.Models
+{
+ public interface IBookModel: IId
+ {
+ string BookName { get; }
+
+ double Cost { get; }
+
+ int Count { get; }
+
+ int GenreId { get; }
+
+ Dictionary BookAuthors { get; }
+ }
+}
diff --git a/BookShop/BookShopDataModels/Models/IClientModel.cs b/BookShop/BookShopDataModels/Models/IClientModel.cs
new file mode 100644
index 0000000..95cd1fa
--- /dev/null
+++ b/BookShop/BookShopDataModels/Models/IClientModel.cs
@@ -0,0 +1,13 @@
+namespace BookShopDataModels.Models
+{
+ public interface IClientModel: IId
+ {
+ string ClientSurname { get; }
+
+ string ClientName { get; }
+
+ string ClientPatronymic { get; }
+
+ string Email { get; }
+ }
+}
diff --git a/BookShop/BookShopDataModels/Models/IGenreModel.cs b/BookShop/BookShopDataModels/Models/IGenreModel.cs
new file mode 100644
index 0000000..fba6efe
--- /dev/null
+++ b/BookShop/BookShopDataModels/Models/IGenreModel.cs
@@ -0,0 +1,7 @@
+namespace BookShopDataModels.Models
+{
+ public interface IGenreModel : IId
+ {
+ string GenreName { get; }
+ }
+}
diff --git a/BookShop/BookShopDataModels/Models/IOrderModel.cs b/BookShop/BookShopDataModels/Models/IOrderModel.cs
new file mode 100644
index 0000000..551950c
--- /dev/null
+++ b/BookShop/BookShopDataModels/Models/IOrderModel.cs
@@ -0,0 +1,15 @@
+namespace BookShopDataModels.Models
+{
+ public interface IOrderModel: IId
+ {
+ int Count { get; }
+
+ int BookId { get; }
+
+ int ClientId { get; }
+
+ double Sum { get; }
+
+ DateTime DateCreate { get; }
+ }
+}
diff --git a/BookShop/BookShop/BookShop.csproj b/BookShop/BookShopView/BookShopView.csproj
similarity index 100%
rename from BookShop/BookShop/BookShop.csproj
rename to BookShop/BookShopView/BookShopView.csproj
diff --git a/BookShop/BookShop/Form1.Designer.cs b/BookShop/BookShopView/Form1.Designer.cs
similarity index 97%
rename from BookShop/BookShop/Form1.Designer.cs
rename to BookShop/BookShopView/Form1.Designer.cs
index 4fdd9f7..8fdf3cd 100644
--- a/BookShop/BookShop/Form1.Designer.cs
+++ b/BookShop/BookShopView/Form1.Designer.cs
@@ -1,4 +1,4 @@
-namespace BookShop
+namespace BookShopView
{
partial class Form1
{
diff --git a/BookShop/BookShop/Form1.cs b/BookShop/BookShopView/Form1.cs
similarity index 79%
rename from BookShop/BookShop/Form1.cs
rename to BookShop/BookShopView/Form1.cs
index b2c163f..8004282 100644
--- a/BookShop/BookShop/Form1.cs
+++ b/BookShop/BookShopView/Form1.cs
@@ -1,4 +1,4 @@
-namespace BookShop
+namespace BookShopView
{
public partial class Form1 : Form
{
diff --git a/BookShop/BookShop/Form1.resx b/BookShop/BookShopView/Form1.resx
similarity index 100%
rename from BookShop/BookShop/Form1.resx
rename to BookShop/BookShopView/Form1.resx
diff --git a/BookShop/BookShop/Program.cs b/BookShop/BookShopView/Program.cs
similarity index 94%
rename from BookShop/BookShop/Program.cs
rename to BookShop/BookShopView/Program.cs
index faf2433..f60ba3b 100644
--- a/BookShop/BookShop/Program.cs
+++ b/BookShop/BookShopView/Program.cs
@@ -1,4 +1,4 @@
-namespace BookShop
+namespace BookShopView
{
internal static class Program
{