Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/37: Рейтинг темы: голосов - 37, средняя оценка - 4.97
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281

Связанные данные в трехуровневой архитектуре

22.09.2019, 23:23. Показов 8726. Ответов 150
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как подтягивать связанные данные в трехуровневой архитектуре?
У меня есть три уровня данных.
На уровне DAL там понятно как обращаться к связанные данным, там есть связи.
Вот на пример в DAL заказ у меня выглядит так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  
public class Order
    {
        public Order()
        {
            this.OrderItems = new HashSet<OrderItem>();
        }
        public Guid OrderId { get; set; }
        public Guid CustomerId { get; set; }
        public DateTime OrderDate { get; set; }
        public DateTime? ShipmentDate { get; set; }
        public int? OrderNumber { get; set; }
        public Guid? StatusId { get; set; }
 
 
        public virtual Customer Customer { get; set; }
        public virtual ICollection<OrderItem> OrderItems { get; set; }
        public virtual Status Status { get; set; }
    }
Уровень BLL DTO
C#
1
2
3
4
5
6
7
8
9
 public class OrderDTO
    {
        public Guid OrderId { get; set; }
        public Guid CustomerId { get; set; }
        public DateTime OrderDate { get; set; }
        public DateTime? ShipmentDate { get; set; }
        public int? OrderNumber { get; set; }
        public Guid? StatusId { get; set; }
    }
Уровень представления у меня 2 модели
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Просто вывод списка заказов
    public class OrderListModel
    {
        public Guid OrderId { get; set; }
        public Guid CustomerId { get; set; }
        public int? OrderNumber { get; set; }
        public Guid? StatusId { get; set; }
    }
 
//Вывод более подробной информации 
 public class OrderViewModel
    {
        public Guid OrderId { get; set; }
        public Guid CustomerId { get; set; }
        public DateTime OrderDate { get; set; }
        public DateTime? ShipmentDate { get; set; }
        public int? OrderNumber { get; set; }
        public Guid? StatusId { get; set; }
        
    
        public IEnumerable<OrderItemListModel> ItemsList { get; set; }
    }
Из этого следует вопрос как получить связанные данные. Что бы на пример вместо ID статуса вылезала надпись (в таблице статус 2 поля (ID,Name)) мне нужно чтобы он подставлял Name. И что бы в подробностях заказа был список товаров.


Как вариант переносить связи на каждый уровень.
Какие еще варианты?
Миниатюры
Связанные данные в трехуровневой архитектуре  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.09.2019, 23:23
Ответы с готовыми решениями:

Удалить связанные данные
Допустим есть две таблицы: &quot;Отцы&quot; и &quot;Дети&quot;. В таблице &quot;Отцы&quot; следующие столбцы: idFather, LastName, FirstName, Age. В таблицы...

Как создать приложение с трехуровневой архитектурой?
Здравствуйте. Я хотел попросить помощи у гуру программистов. Как создать приложение с трех уровневой архитектурой? В своей программе...

Поделитесь информацией о приложениях с трёхуровневой архитектурой
Если кто то может поделитесь информацией о приложениях с трёхуровневой архитектурой. Если даже кто-то делал подобные проекты поделитесь...

150
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
28.09.2019, 22:15
Студворк — интернет-сервис помощи студентам
Dimastaaa, Cherry_Pie, просто сделайте как в гитхабовском примере, все ведь через практику...
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
28.09.2019, 22:18  [ТС]
IamRain, у меня сейчас по сути так же. Но там нет бизнес слоя по факту. Там сразу из dal перегоняется во view
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
28.09.2019, 22:18
Как уже сказали, это довольно часто встречающийся и правильный способ организации проекта. Разве что SociaGoal.Core содержит лишь один класс ValidationResult - возможно этой сборки не будет позже.
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
28.09.2019, 22:21  [ТС]
IamRain, у меня щас из dal=>dto, чуть-чуть ее обогащаю, в 2 моделях, => во view.
Потом тоже самое обратно

Добавлено через 57 секунд
IamRain, в дальнейшем мне придётся реализовывать скидку для каждого заказчика, которая индивидуальна, мне ее тогда в dto делать? Вроде как это не верно
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
28.09.2019, 22:30
Cherry_Pie, ну можно добавить этот слой и поместить туда фильтрацию и маппинг.
Соответственно, на входе и на выходе у сервисов должны светиться только Dto и/или бизнес-модели и ни намека на Dal-модели.
А про наличие или отсутствие Id - забудьте, это все равно DDD по сути.
Если уж приспичило - можно все модели в сборке Domain пометить как partial и оформить без Id-шников, а вторую часть реализовать в Dal-сборке уже с Id-шниками.
Тогда быть может вам станет спокойнее, но так все равно никто не делает в enterprise-е. По крайне мере я не видел.

Добавлено через 4 минуты
Цитата Сообщение от Cherry_Pie Посмотреть сообщение
которая индивидуальна, мне ее тогда в dto делать?
Либо в сервисе для работы с клиентами (если таковой имеется), либо в сервисе, реализующем работу с товаром/заказами, это же бизнес-логика, как никак.
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
28.09.2019, 22:33  [ТС]
IamRain, так я так и расписывал.
Dal=> dto =>domain+service=> view? Так?
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
29.09.2019, 13:41  [ТС]
sau, правильно начинаю понимать?
модель domain уже больше похожа на человеческую?
я из dal вытаскиваю данные в одну бизнес модель и из нее могу раскидывать данные на разные view.
например в list заказов я вывожу: OrderNumber, CustomerCode,Status
а уже в деталях я вывожу все.
Верно ли мое понимание? или опять чушь?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class OrderDomain
    {
        public int OrderNumber { get; set; }//ИЗ БД
        public string CustomerCode { get; set; }//В модели БД здесь GUID заказчика
 
        public DateTime OrderDate { get; set; }
        public DateTime? ShipmentDate { get; set; }
        public string Status { get; set; }//В модели БД здесь GUID статуса
 
        public string Total { get; set; }//Рассчитывается на ходу
 
        public IEnumerable<OrderItemDomain> orderItems { get; set; }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
 public class OrderItemDomain
    {
        public string OrderCode { get; set; }
 
        public string ItemCode { get; set; }
        public string ItemName { get; set; }
 
        public int ItemCount { get; set; }
        public decimal ItemPrice { get; set; }
 
        public decimal Summ { get { return ItemCount * ItemPrice; } set; } //Рассчитывается на ходу
    }
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
29.09.2019, 19:02
Cherry_Pie, технически должна быть возможность просто раскидать их по разным серверам , тогда будет видно ,
Цитата Сообщение от Cherry_Pie Посмотреть сообщение
Допустим я имею dal модели, бизнес модели с более обогащенными полями, которые рассчитываются на ходу. Для этого я беру DAL модель(вот прям как она есть). Маплю ее в DTO уже с человеческими данными без IDсамой сущности и без ID(ссылки на другие таблицы), верно?
И потом уже из "человеческой" DTO передаю в "человеческую" бизнес модель, в которой идет работа уже с "человеческими" данными, верно?
да , просто смотрите на это шире , в других видах приложений вы можете получать данные кусочками от различных веб.сервисов , из различных БД - соответственно , что бы с этими данными работать их так или иначе нужно отразить на какие то структуры у себя в приложении. - но , это все транспортные данные , из которых потом нужно слепить агрегатную модель , с которой удобно работать в бизнес.процессе , и которая может сильно отличатся от транспортных моделей заточенных под другие цели. , т.е бизнес логика и ее модель становится свободной от тех.деталей инфраструктуры (мы не мусорим ее всякими DataAnnotaion атрибутами для БД , не нагромождаем всякие JsonProperty для сериализации под сеть и т.п. - это другая модель для других целей). А так , поскольку в вашем проекте нет никаких нюансов . то ваша доменная модель = модель данных. = и даже может быть = ViewModel
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
29.09.2019, 19:11  [ТС]
sau, я наконец-то сделал вывод нормальных значений, а не IDшники на другие таблицы.
нормально или намудрил? ) Но опять же, тут у меня просто Entity=>View

C#
1
2
3
4
5
6
7
8
9
10
11
 public class ItemDTO 
    {
        public Guid ItemId { get; set; }
        public string Code { get; set; }
        public string Name { get; set; }
        public decimal? Price { get; set; }
        public Guid? CategoryId { get; set; }
 
//Вот добавляю "человеческое" поле 
        public string CategoryName { get; set; }
    }

Выборка по одному товару в service
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
public ItemDTO GetItem(string code)
        {
            var item = _unitOfWork.ItemRepository.GetByCode(code);
         
            ItemDTO itemDTO = new ItemDTO();
            itemDTO.ItemId = item.ItemId;
            itemDTO.Code = item.Code;
            itemDTO.Name = item.Name;
            itemDTO.Price = item.Price;
            itemDTO.CategoryId = item.CategoryId;
            itemDTO.CategoryName = item.Category.Name;
 
            return itemDTO;
        }
Выбираю список
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  public IEnumerable<ItemDTO> GetItems()
        {
         
            var items = _unitOfWork.ItemRepository.Get();
 
            List<ItemDTO> itemsDTOs = new List<ItemDTO>();
 
            foreach (var item in items)
            {
                var Item = new ItemDTO
                {
                    Code = item.Code,
                    CategoryId = item.CategoryId,
                    CategoryName = item.Category.Name,
                    ItemId = item.ItemId,
                    Name = item.Name,
                    Price = item.Price
                };
                itemsDTOs.Add(Item);
            }
 
            return itemsDTOs;
        }

Тут в конроллере перегоняю из dto во view
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
 public ActionResult Index()
        {
            try
            {
                IEnumerable<ItemDTO> _itemDTOs = _itemService.GetItems();
             
                List<ItemListModel> _itemLM = new List<ItemListModel>();
 
                foreach (var item in _itemDTOs)
                {
                    var Item = new ItemListModel
                    {
                        Code = item.Code,
                        CategoryName = item.CategoryName,
                        Name = item.Name,
                        Price = item.Price
                    };
                    _itemLM.Add(Item);
                }
 
                return View(_itemLM);
            }
            catch (ValidationException ex)
            {
                return Content(ex.Message);
            }
        }
Добавлено через 2 минуты
sau, А, и еще вопрос. Чтобы загнать данные в droplist это вот так вот надо исхитриться?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 public ActionResult Create()
        {
            IEnumerable<CategoryDTO> _categoryDTOs = _categoryService.GetCategorys();
 
            List<CategoryDropList> _categoryDL = new List<CategoryDropList>();
            foreach (var category in _categoryDTOs)
            {
                var Category = new CategoryDropList
                {
                    CategoryId = category.CategoryId,
                    Name = category.Name
                };
                _categoryDL.Add(Category);
            } 
 
            SelectList list = new SelectList(_categoryDL, "CategoryId", "Name");
       
            ViewBag.Category = list;
 
            return View();
        }
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
29.09.2019, 19:30
Cherry_Pie, мне ItemDTO не нравится ) , у Вас уже есть структура данных , получаемая от репозитория , она содержит поля присущие системе хранения - внешние ключи такие как CategoryId для связанных структур в хранилище , первичные ключи в хранилище - такие как ItemId.
И у Вас есть доменная модель (почему-то именуемая как ItemDTO) , в которой достаточно определить поля предметной области -


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
[Table("dbo.Item")]
public class ItemData(DTO):EntityDataModel
{
     [Key]
     public Guid ID {get;set;}
     public string Code { get; set; }
     public string Name { get; set; }
     public decimal Price { get; set; }
     [ForegeinKey("Currency")]
     public Guid CurrencyId { get; set; }
     [ForegeinKey("Category")]
     public Guid CaregoryId { get; set; }
 
}

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
public class Item
{
     public string Code { get; private set; }
     public string Name { get; private set; }
     public decimal Price { get; private set; }
     public Currency Currency { get; private set; }
     public Category Caregory { get; private set; }
     
     public void SetCode(string newCode) 
     {
         if(IsValid(newCode)) Code = newCode;
     }
 
}
ну и дальше есть ItemView

C#
1
2
3
4
5
6
7
8
9
public class ItemView
{
    private readonly Item item;
    public ItemView(Item item) { this.item = item }
 
     public string Name=>$"{item.Name} {item.Code}";
     public string Price=>$"{item.Price} {item.Currency.Name}";
     public string CategoryName=>item.Caregory.Name
}
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
29.09.2019, 19:34  [ТС]
sau,
Цитата Сообщение от sau Посмотреть сообщение
public Category Caregory { get; set; }
А Тип Category он из DAL(т.е. прям сущность БД) или это тип из BLL, просто еще раз созданная сущность?

Добавлено через 3 минуты
sau, Получается
1) Entity БД
2) Бизнес модель
3) Модель представления?
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
29.09.2019, 19:35  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
[Table("dbo.Item")]
public class ItemData(DTO):EntityDataModel
{
У меня нет такого))
Миниатюры
Связанные данные в трехуровневой архитектуре  
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
29.09.2019, 19:36
Вообще , Вам тут уже тучу примеров накидали , и тучу статей , не знаю какие еще могут быть вопросы )
Цитата Сообщение от Cherry_Pie Посмотреть сообщение
У меня нет такого))
это псевдокод , для демонстрации возможных различий в моделях , Вы можете например edmx заюзать , там будет ).
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
29.09.2019, 19:37  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
Вообще , Вам тут уже тучу примеров накидали , и тучу статей , не знаю какие еще могут быть вопросы )
Да там все отрывками, урывками.
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
29.09.2019, 19:38
Цитата Сообщение от Cherry_Pie Посмотреть сообщение
1) Entity БД
2) Бизнес модель
3) Модель представления?
ну как минимум.
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
29.09.2019, 19:40  [ТС]
sau, Спасибо, щас еще попробую
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
29.09.2019, 19:41
Цитата Сообщение от Cherry_Pie Посмотреть сообщение
А Тип Category он из DAL(т.е. прям сущность БД) или это тип из BLL, просто еще раз созданная сущность?
из BLL , BLL не должна зависит от структур хранения данных т.к , уже в 10-й раз пишу , они разные и для BLL непригодные.
так же как Item отличается от ItemData или от ItemView , почему у Вас ItemView не вызвает вопросов ? - потому, что она наиболее очевидным образом решает задачи представления , аналогично и другие модели , каждая решает задачу в рамках своего слоя. , но как уже так же писал - если не заморачиватся . то можно сделать одну общую модель на все случаи, для проектов полностью под вашим контролем
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
29.09.2019, 19:49  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
public string Name=>$"{item.Name} {item.Code}";
А это я так понимаю тоже псевдокод?
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
29.09.2019, 19:58
Цитата Сообщение от Cherry_Pie Посмотреть сообщение
А это я так понимаю тоже псевдокод?
нет , это c#6 , например имя тут представлено чуть более информативным способом для потребностей интерфейса., пример так же ради демонстрации возможной разницы между моделями
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
29.09.2019, 20:07  [ТС]
sau, Я наверно вас уже в конец достал) , но начинаю понимать))
Типа такого нужно?
Первичные ключи выбрасываем, а вместо внешних подтягиваем данные?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace BusinessLayer.Domain
{
    public class OrderDomain
    {
        public int OrderNumber { get; set; }
        public CustomerDomain Customer { get; set; }
 
        public DateTime OrderDate { get; set; }
        public DateTime? ShipmentDate { get; set; }
        public Status Status { get; set; }
        public string Total { get; set; }//Рассчитается 
 
        public IEnumerable<OrderItemDomain> orderItems { get; set; }
    }
}
Тогда следующий вопрос, где их маппить? в сервисах? сразу напрямую?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.09.2019, 20:07

Не могу получить связанные данные из БД
Не могу получить связанные данные из базы PositionName, DepartmentName, OfficeName, EmployerName. Посоветуйте что можно сделать? Есть...

Не получается сделать связанные данные
Вот код программы using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using...

Добавить данные в связанные таблицы postgres
Здравствуйте. Столкнулся с проблемой, Есть таблица комплектующих с полями idgr, idedzim, name. Поля idgr и idediz связаны с полями таблиц...

Как вывести связанные данные из модели?
Есть модель public class Game { public int Id { get; set; } public string Name { get; set; } ...

Не правильно отображаются связанные данные из БД в DataGridview
в DataGridview загружаю данные и таблицы БД (скрин 3), в таблице одна колонка подстановка данных из другой таблицы. Колонка ФИО связана с...


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

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru