Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 5

Трехуровневая архитектура - Как осуществить связь между уровнями

03.11.2014, 17:55. Показов 7681. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь разобраться с трехуровневой архитектурой, в особенности с тем, как осуществить связь между уровнями. К примеру в многослойном приложении связь между слоями основывается на абстракции и событиях. Как же связать между собой уровни?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.11.2014, 17:55
Ответы с готовыми решениями:

Как сделать тест с двумя уровнями вопросов и переход между уровнями
Ребята подскажите пожалуйста, как можно сделать тест с двумя уровнями вопросов и переход между уровнями! У теста будет такая логика,...

Трехуровневая архитектура
В общем пытаюсь разобраться с трехуровненой архитектурой построения приложения(UI,Data access layer и business logic layer). Как бы у меня...

Трехуровневая архитектура
1)Где должны быть репозитории? в DL(data layer) или в BL(buisness)? 2)Если кроме CRUD мне нужно выбирать (по 2-4 условиям) это все нужно...

8
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.11.2014, 18:58
Лучший ответ Сообщение было отмечено nf1jkd7 как решение

Решение

Цитата Сообщение от nf1jkd7 Посмотреть сообщение
в многослойном приложении связь между слоями основывается на абстракции и событиях. Как же связать между собой уровни?
Точно так же, как и в многослойном приложении: основываясь на абстракции и события.

Если архитектура приложения изначально построена грамотно, то разделение на уровни происходит легко и приятно: меняется только реализация отдельных сервисов, а интерфейсы остаются неизменными: код, который отвечает за бизнес-логику "уезжает" на второй уровень, а в месте вызова (первый уровень) реализация логики меняется на работу с удаленным сервисом. Потом на втором уровне происходит то же самое: логика извлечения и сохранения данных "уезжает" на третий уровень, а там, где она была, реализация заменяется на работу с БД или на дополнительный уровень абстракции, если систему хранения планируется менять или добавлять избыточность. Это уже получится n-уровневая архитектура.

Например, у вас есть многослойное приложение, выглядящее примерно так (псевдокод):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Client
{
   public void ShowNewUser()
   {
      var logic = new BusinessLogic();
      try 
      {
         var user = logic.CreateNewUser(defaultName);
         DisplayUserInUI(user);
      }
      catch (InvalidUsernameException)
      {
            DisplayError();
      }
   }
}
 
class BusinessLogic
{
   public User CreateNewUser(string name)
   {
      if (ValidateName(name))
      {
           var storage = new Storage();
           var user = new User(name);
           storage.Adduser(user);
           return user;
      }
      throw new InvalidUsernameException();
   }
}
 
class Storage
{
   public void AddUser(User user)
   {
      File.AppendText("users.txt", user.AsJson());
   }
}
Разделяется это на трехуровневую архитектуру примерно так:
1. Переносим бизнес-логику на второй уровень, добавляя способ сообщения (сокеты, REST, WCF и т.д.):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class CreateUserRequestHandler
{
   public void HandleCreateUserRequest(string name)
   {
      if (ValidateName(name))  // Валидация имени, в данном случае — наша бизнес логика
      {
           var storage = new Storage();
           var user = new User(name);
           storage.Adduser(user);
           Response.Write(user.AsJson());
      }
      Response.Write(new InvalidUsernameResponse());
   }
}
 
class Storage
{
   public void AddUser(User user)
   {
      File.AppendText("users.txt", user.AsJson());
   }
}
Обратите внимание, что работа с данными (Storage) тоже уехала вместе с логикой на второй уровень.
2. Меняем реализацию бизнес-логки на первом уровне с непосредственной логики на общение со вторым уровнем:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Client
{
   public void ShowNewUser()
   {
      var logic = new BusinessLogic();
      try 
      {
         var user = logic.CreateNewUser(defaultName);
         DisplayUserInUI(user);
      }
      catch (InvalidUsernameException)
      {
            DisplayError();
      }
   }
}
 
class BusinessLogic
{
   public User CreateNewUser(string name)
   {
      var response = SendRemoteRequest(new CreateNewUserRequest(name));
      if (response.IsValid)
         return User.FromJson(response.Data);
      else
         throw LogicException.FromJson(response.Data);
   }
}
Код клиента остался таким же, а код бизнес-логики, уехавшей на второй уровень, поменялся на код общения с удаленным сервером. Никакой валидации, тупая обработка ответа.

3. Теперь надо увести логику работы с данными на третий уровень. Здесь зачастую просто меняется место хранения данных на сервер БД и меняется код на соединение с этой БД. А третий уровень состоит исключительно из СУБД и данных.
Код второго уровня становится таким:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class CreateUserRequestHandler
{
   public void HandleCreateUserRequest(string name)
   {
      if (ValidateName(name))  // Валидация имени, в данном случае — наша бизнес логика
      {
           var storage = new Storage();
           var user = new User(name);
           storage.Adduser(user);
           Response.Write(user.AsJson());
      }
      Response.Write(new InvalidUsernameResponse());
   }
}
 
class Storage
{
   public void AddUser(User user)
   {
      using (var db = new BusinessEntities(remoteBdConnectionString))
      {
         db.Users.Add(user);
         db.SaveChanges();
      }
   }
}
То есть интерфейс работы с данными опять не меняется, а меняется только непосредственно реализация модуля (в данном случае Storage).
Здесь иногда вместо непосредственной работы с хранилищем работу класса Storage тоже разделяют на два (а то и больше!) уровней: на втором уровне оставляют так же код удаленного сообщения, на третьем уровне добавляется еще один сервис, который уже распределяет данные по разным БД (избыточность).
1
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 5
03.11.2014, 20:45  [ТС]
В чем тогда отличие приведенного вами примера трехуровнего приложения от сервисно-ориентированного?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.11.2014, 21:13
Цитата Сообщение от nf1jkd7 Посмотреть сообщение
В чем тогда отличие приведенного вами примера трехуровнего приложения от сервисно-ориентированного?
Отличие может быть от "ни в чем" до "практически во всем", в зависимости от реализации конкретной системы.
То есть они не обязательно взаимоисключающие.

Основное отличие в том, что многоуровневая архитектура подразумевает именно физическое разделение подсистем, а SOA делает уклон на следование принципам сервис-ориентированной архитектуры, в которые физическое разделение не входит. То есть приложение, построенное на принципах SOA может держать все подсистемы на локальной машине, главное чтобы они были жестко разделены (отдельные процессы), следовали контрактам и т.д.
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 5
03.11.2014, 21:38  [ТС]
Признаю свою ошибку. Просто в приведенном примере меня очень смущает наличие работы с сервисом (т.к. знания в этой области у меня пока нулевые). Предполагает ли само понятие многоуровневая архитектура обязатальное наличие сервисов и работы с ними или можно обойтись и без них (не в данном примере, а в общем)?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.11.2014, 21:44
Цитата Сообщение от nf1jkd7 Посмотреть сообщение
Предполагает ли само понятие многоуровневая архитектура обязатальное наличие сервисов и работы с ними или можно обойтись и без них (не в данном примере, а в общем)?
Смотря какой смысл вы вкладываете в понятие "сервис".
Многоуровневая архитектура — это физическое разделение слоев приложения.
Как при этом происходит связь между ними — значения не имеет, хоть телепатию используйте
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 5
03.11.2014, 22:11  [ТС]
Я имею в виду Web-сервис. Ели взять архитектуру следующего типа: База Данных - Бизнес-логика - Веб-сервис - Пользовательский интерфейс. Какие у нее преимущества/недостатки по сравнению с архитектурой База Данных - Бизнес-логика - Пользовательский интерфейс?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.11.2014, 22:41
Цитата Сообщение от nf1jkd7 Посмотреть сообщение
Ели взять архитектуру следующего типа: База Данных - Бизнес-логика - Веб-сервис - Пользовательский интерфейс. Какие у нее преимущества/недостатки по сравнению с архитектурой База Данных - Бизнес-логика - Пользовательский интерфейс?
Как гласит известный афоризм, все проблемы в информатике могут быть решены путем добавления дополнительного уровня абстракции. Кроме проблемы слишком большого количества этих уровней.

Суть многоуровневой архитектуры в распределении функционала с учетом "железных" ресурсов и требований приложения к ним.
Добавление веб-сервиса между бизнес-логикой и клиентом — дальнейшее распределение этих обязанностей, в данном случае логики общения с клиентом и, собственно, бизнес-логики. Например, часть бизнес логики может требовать внушительного количества ресурсов для всяких расчетов, что делает "сожительство" на одной системе слоя с логикой и слоя, ответственного за общение с клиентом, недостаточным. Например, какая-то часть бизнес логики делает сложные вычисления и при этом у нас большое количество клиентов, которые постоянно делают запросы. В таких условиях очень быстро проявится гонка за ресурсами, так что здесь будет выгодно разбить эти компоненты, создав дополнительный уровень, в который вынести логику. Там можно, например, разойтись и реализовать распределенные вычислений на ферме, а на уровне веб-сервиса реализовать распределение запросов по свободным серверам с логикой или создать очередь запросов (если играете в какой-нибудь ВоВ, то очередь на переполненный сервер в пиковое время — это оно самое).
Уровень с веб-сервисом пусть отвечает себе исключительно за работу с большим количеством подключений: представьте себе какой-нибудь гугл или твиттер, где миллионы человек ежесекундно делают запросы, а в случае гугла эти запросы еще и нужно довольно серьезно обработать, подобрав и отфильтровав результаты поиска.

Ну а минусы — они как в любой многоуровневой системе: задержка не нулевая, ширина канала не бесконечная, сеть не 100% надежная, платформы не всегда совместимы по версиям и т.д. С каждым добавлением уровня эти проблемы накапливаются.
1
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 5
04.11.2014, 09:01  [ТС]
Огромное спасибо за ответы Теперь стало гораздо понятнее, а то с литературой по архитектуре мне не очень везет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.11.2014, 09:01
Помогаю со студенческими работами здесь

Трехуровневая архитектура в MVC
Подскажите, мне нужно создать приложение с использованием ASP.NET MVC + MS SQL +ORM Entity Framework. При этом архитектура приложения...

Трехуровневая архитектура с клиентом на JavaFX
Клиент JavaFX, сервер C++/PHP, база MySQL Не могу найти в интернете годного источника по этой теме. Буду сильно признателен за какую то...

Трехуровневая архитектура БД - разобраться в устройстве
Хэй) Пользуюсь СУБД Oracle Database 11g Express Edition. интегрированная среда разработки на языках: sql developer а прослойка...

Трехуровневая архитектура ИС - нужен пример
Здравствуйте. Передо мной стоит задача изучить трехуровневую архитектуру. Полазив в интернете, я нашел кучу теории, причем везде написано...

ASP.NET MVC трехуровневая архитектура
Суть заключается в следующем, мне необходимо реализовать проект ASP.NET MVC (задание на собеседование) проект с трехуровневой архитектурой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru