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

Трехуровневая архитектура

08.09.2019, 20:39. Просмотров 3212. Ответов 41
Метки нет (Все метки)

1)Где должны быть репозитории? в DL(data layer) или в BL(buisness)?
2)Если кроме CRUD мне нужно выбирать (по 2-4 условиям) это все нужно дописывать в этот же репозиторий?
3)На пример проверка наличие элемента в БД это в DL или BL?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2019, 20:39
Ответы с готовыми решениями:

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

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

Правильная архитектура
Возможно, вопрос покажется ни о чем, но для меня совсем неочевидно как было бы правильнее. ...

Архитектура приложения
На курсовую необходимо разработать такое приложение, чтобы на отдельном уровне был back-end (сервер...

41
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
09.09.2019, 14:58  [ТС] 2
ПОМОГИТЕЕЕ!!!!!!!!!!!!!
0
532 / 510 / 140
Регистрация: 17.07.2012
Сообщений: 1,508
Записей в блоге: 1
12.09.2019, 14:46 3
Цитата Сообщение от Dimasta1488 Посмотреть сообщение
1)Где должны быть репозитории? в DL(data layer) или в BL(buisness)?
Репозиторий - есть коллекция доменных/бизнес объектов. Да, это часть доменного/бизнес слоя.
Цитата Сообщение от Dimasta1488 Посмотреть сообщение
2)Если кроме CRUD мне нужно выбирать (по 2-4 условиям) это все нужно дописывать в этот же репозиторий?
да
Цитата Сообщение от Dimasta1488 Посмотреть сообщение
3)На пример проверка наличие элемента в БД это в DL или BL?
Зависит от задачи. Если задача, например, защитить хранилище от дубликатов - это DL.
1
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
12.09.2019, 14:52  [ТС] 4
Cupko, а если например в БД у меня таблица элемента товара с полями : Id, Id_заказа, id_заказчика, цена, количество.
А выводить я хочу все те же поля, + сумма(цена*кол-во), то в моделе представления я должен добавить это поле?


Что значит доменный/бизнес слой?
0
532 / 510 / 140
Регистрация: 17.07.2012
Сообщений: 1,508
Записей в блоге: 1
12.09.2019, 15:00 5
Цитата Сообщение от Dimasta1488 Посмотреть сообщение
а если например в БД у меня таблица элемента товара с полями : Id, Id_заказа, id_заказчика, цена, количество.
А выводить я хочу все те же поля, + сумма(цена*кол-во), то в моделе представления я должен добавить это поле?
А в чем, собственно, вопрос?
Если это часть представления - добавляйте в модель представления.
Цитата Сообщение от Dimasta1488 Посмотреть сообщение
Что значит доменный/бизнес слой?
То, о чем вы спрашивали - domain layer == business layer.
1
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
12.09.2019, 15:16  [ТС] 6
Cupko, а почему на большинстве ресурсов репозитории используются в data layer? В бизнес слое только в одном видео так сделано
0
532 / 510 / 140
Регистрация: 17.07.2012
Сообщений: 1,508
Записей в блоге: 1
12.09.2019, 15:28 7
Dimasta1488, кто их знает.
Нынче вообще модно называть репозиторием всё, что достает из базы данные.
Еще путаницы добавляют ORM и их Code/Model first подходы. Где бизнес-модели совпадает с моделью данных, а контекст доступа к данным сам является и репозиторием и маппером и табличным адаптером.
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
12.09.2019, 15:32  [ТС] 8
Cupko, т.е. в DL есть только сущности БД, правильно?
В BL репозитории и логика?
А в уровне презентации модели, котора уже будут представлены пользователю, правильно?
0
532 / 510 / 140
Регистрация: 17.07.2012
Сообщений: 1,508
Записей в блоге: 1
12.09.2019, 15:37 9
Цитата Сообщение от Dimasta1488 Посмотреть сообщение
т.е. в DL есть только сущности БД, правильно?
А что вы подразумеваете под сущностью бд? Если модели, представляющие таблицы/строки таблиц БД и классы доступа к БД - то да.
Цитата Сообщение от Dimasta1488 Посмотреть сообщение
В BL репозитории и логика?
Репозитории, логика и доменная(бизнес) модель.
Цитата Сообщение от Dimasta1488 Посмотреть сообщение
А в уровне презентации модели, котора уже будут представлены пользователю, правильно?
Да. Если они (view-модели) вообще нужны.
1
2370 / 1832 / 330
Регистрация: 22.07.2011
Сообщений: 7,025
14.09.2019, 11:44 10
Лучший ответ Сообщение было отмечено Dimasta1488 как решение

Решение

Цитата Сообщение от Cupko Посмотреть сообщение
Репозитории, логика и доменная(бизнес) модель.
Репозитории — это классы или компоненты, которые определяют способ доступа к источникам данных.
Это не просто коллекция , иначе не было бы смысла изобретать новый термин , это коллекция связанная тем или иным образом с хранилищем данных.
в таком контексте , во всех принятых реализациях , репозиторий содержит идею абстрагирования от способа извлечения/укладки коллекции из/в хранилища. Исходя из чего , самое место ему в слое данных , т.к это никак не коллекция бизнес модели.

Цитата Сообщение от Cupko Посмотреть сообщение
2)Если кроме CRUD мне нужно выбирать (по 2-4 условиям) это все нужно дописывать в этот же репозиторий?
а я бы сказал нет ) , если задача репозитория правильно уложить или достать коллекцию исходя из особенностей хранилища (файл , бд , облако и т.п.),
то логика формирования запроса к репозиторию на выборку тех или иных значений коллекции уже за рамками его полномочий и лежит уровнем выше - либо на уровне сервисов данных , либо на уровне бизнес сервисов если логика построения запроса зависима от бизнес.условий.

Схематично цепочка ответственности примерно такая:
business service (бизнес логика) ->data service (логика выборки данных по разным репозиториям) ->repository (абстракция от хранилища) ->store (хранилище)
1
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
15.09.2019, 18:57  [ТС] 11
sau, Здравствуйте, не подскажите как лучше сделать разделение панелей менеджера/покупателя?
На пример менеджер может добавлять/изменять/ удалять товар, а покупать может только добавить в корзину.
разные areas? или может какие-нибудь другие варианты.
Т.е. при авторизации идет проверка кто это, и перекидывает на нужный areas.
0
2370 / 1832 / 330
Регистрация: 22.07.2011
Сообщений: 7,025
15.09.2019, 19:27 12
Dimasta1488,
дело не в менеджере или покупателе , а в том , какую задачу помогает решить интерфейс , в вашем случае два вида интерфейса - один удобный для покупок . а другой для администрирования (у кого и какие будут атрибуты администрирования уже 10й вопрос)
По этому , можно вообще в разных веб.приложениях - админка сама по себе.
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
15.09.2019, 19:30  [ТС] 13
sau, Ну вот например у заказчика рядом с товаром будет "добавить в корзину", у менеджера -удалить/изменить.
это тоже делать через атрибуты?
или уже легче сделать разные области и работать с ними как будто с разными приложениями?
Просто задача стоит сделать 2 роли: заказчик и менеджер с разными действиями
0
2370 / 1832 / 330
Регистрация: 22.07.2011
Сообщений: 7,025
15.09.2019, 19:49 14
Dimasta1488, ну , если заказчику и менеджеру удобно работать с общим интерфейсом , то вам всего лишь нужно проверять их атрибуты доступа на том или ином уровне.
Как и с помощью чего это уже отдельная тема , можно на уровне построения элементов интерфейса , еще можно на уровне бизнес методов и т.п , мне , например , нравится ABAC подход более чем RBAC , а контроль доступа удобно делать в парадигме АОП , например PostSharp или RealProxy/ , есть еще такие штуки как XACML

В общем , различных подходов и инструментов хватает. , то что есть в mvc из коробки - на этом не нужно зацикливаться. , это поверхностный контроль на уровне запросов для сайта.
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
15.09.2019, 20:03  [ТС] 15
sau, что значит уровень построения элементов интерфейса?
хорошо, как мне реализовать замену элентов интерфейса? где нужно делать условие что зашел заказчик и заменить удалить/изменить на добавить в корзину?
0
2370 / 1832 / 330
Регистрация: 22.07.2011
Сообщений: 7,025
15.09.2019, 20:36 16
Dimasta1488, это значит , что можно например прикрутить вашу систему безопасности к рендер.движку , в результате чего он либо отрисует элемент , либо нет. - как вариант.
0
16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
17.09.2019, 00:17  [ТС] 17
sau, Здравствуйте.
В общем я сделал 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
27
public class ItemController : Controller
    {
        //_itemDTO - модель заказчиков в бизнес модели
        //_itemVM - модель заказчиков в модели отображения (отображение в таблице)
        //_itemEM - модель заказчиков в модели отображения (редактирование/просмотр)
        public IItemService _itemService;
 
        public ItemController(IItemService itemService)
        {
            _itemService = itemService;
        }
//Через автомаппер сопоставляю типы бизнес модели и модели представления
        public ActionResult Index()
        {
            try
            {
                IEnumerable<ItemDTO> _itemDTOs = _itemService.GetItems();
                var mapper = new MapperConfiguration(cfg => cfg.CreateMap<ItemDTO, ItemViewModel>()).CreateMapper();
                var _itemVMs = mapper.Map<IEnumerable<ItemDTO>, List<ItemViewModel>>(_itemDTOs);
 
                return View(_itemVMs);
            }
            catch (ValidationException ex)
            {
                return Content(ex.Message);
            }
        }
C#
1
2
3
4
5
6
7
8
9
10
11
//Возраст добавил просто ради эксперимента, можно на него не обращать внимание
    //Модель вывода в таблице
    public class CustomerViewModel : Customer
    {
    }
 
    //Модель редактирования/ просмотра/ 
    public class CustomerEditModel : Customer
    {
        public int Age { get; set; }
    }

И собственно сам сервис
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
 
     //  _customerDB - модель заказчиков в БД
    //  CustomerDTO - модель заказчиков в бизнес модели  
    public class CustomerService : ICustomerService
    {
        UnitOfWork _unitOfWork;
        public CustomerService(UnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
        }
 
        public CustomerDTO GetCustomer(Guid? id)
        {
            if (id == null)
                throw new ValidationException("Id заказчика не установлено", "");
 
            var customer = _unitOfWork.CustomerRepository.GetByID(id.Value);
 
            if (customer == null)
                throw new ValidationException("Заказчик не найден", "");
 
            var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Customer, CustomerDTO>()).CreateMapper();
            return mapper.Map<Customer, CustomerDTO>(customer);          
        }
 
        public IEnumerable<CustomerDTO> GetCustomers()
        {
            var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Customer, CustomerDTO>()).CreateMapper();
            return mapper.Map<IEnumerable<Customer>, List<CustomerDTO>>(_unitOfWork.CustomerRepository.Get());
        }
НУ и по аналогии было сделано добавление/удаление


Теперь у меня стоит задача сделать корзину и заказ. На сайта microsoft есть статья, но там идет дополнительная сущность(Cart). (Диаграмма БД в приложении)
На webform я делал без доп сущности.
Тут же я не пониманию с чего мне начать.
Вот со view у меня приходит ID товара, причем модель не как в БД, не как DTO, а модель представления(конкретно в моем случае они одинаковые, но ради тренировки я добавил модель представления).
Через Service получаю ID и я имею уже модель DTO, но что мне делать дальше? В сервисе писать всю логику добавления в заказ?
НУ что в BL это понятно, а где конкретно? в services или же в отдельных классах?
0
Миниатюры
Трехуровневая архитектура   Трехуровневая архитектура   Трехуровневая архитектура  

16 / 10 / 4
Регистрация: 16.12.2017
Сообщений: 281
17.09.2019, 00:32  [ТС] 18
Первый контроллер не верный я указа. Вот верный
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
40
41
42
43
44
45
46
47
48
49
50
 //_customerDTO - модель заказчиков в бизнес модели
        //_customerVM - модель заказчиков в модели отображения (отображение в таблице)
        //_customerEM - модель заказчиков в модели отображения (редактирование/просмотр)
        public ICustomerService _customerService;
 
        public CustomerController(ICustomerService customerService)
        {
            _customerService = customerService;
        }
 
        public ActionResult Index()
        {
            try
            {
                IEnumerable<CustomerDTO> _customerDTOs = _customerService.GetCustomers();
                var mapper = new MapperConfiguration(cfg => cfg.CreateMap<CustomerDTO, CustomerViewModel>()).CreateMapper();
                var _customerVMs = mapper.Map<IEnumerable<CustomerDTO>, List<CustomerViewModel>>(_customerDTOs);
 
                return View(_customerVMs);
            }
            catch (ValidationException ex)
            {
                return Content(ex.Message);
            }
        }
 
        public ActionResult Create()
        {
            return View();
        }
//Через автомаппер сопоставляю типы бизнес модели и модели представления
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(CustomerViewModel customerVM)
        {
            try
            {
                var mapper = new MapperConfiguration(cfg => cfg.CreateMap<CustomerViewModel, CustomerDTO>()).CreateMapper();
                CustomerDTO _customerDTO = mapper.Map<CustomerViewModel, CustomerDTO>(customerVM);
                _customerDTO.CustomerId = Guid.NewGuid();
                _customerService.AddCustomer(_customerDTO);
 
                return RedirectToAction("Index");
            }
            catch (ValidationException ex)
            {
                ModelState.AddModelError(ex.Property, ex.Message);
            }
            return View();
        }
0
186 / 99 / 19
Регистрация: 15.09.2011
Сообщений: 801
17.09.2019, 04:52 19
Dimasta1488, на счёт мапперов немного поправлю
вот эти дела
var mapper = new MapperConfiguration(cfg => cfg.CreateMap<CustomerDTO, CustomerViewModel>()).CreateMa pper();
var mapper = new MapperConfiguration(cfg => cfg.CreateMap<CustomerViewMode l, CustomerDTO>()).CreateMapper() ;

не должны делаться в каждом методе, а инициализироваться на самом верхнем уровне вот таким образом

var mapper = new MapperConfiguration(cfg => cfg.CreateMap<CustomerViewMode l, CustomerDTO>())
.ReverseMapping.CreateMapper() ;

А лучше вот так:
AutomapperProfileConfig.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
public class AutomapperProfileConfig
    {
        public static MapperConfiguration SetupMappings()
        {
            return new MapperConfiguration(cfg =>
            {
                cfg.AddProfile<CustomerMapProfile>();
            });
        }
    }


CustomerMapProfile.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
public class CustomerMapProfile: Profile
    {
        public CustomerMapProfile()
        {
CreateMap<CustomerViewModel, CustomerDTO>())
.ReverseMapping();
        }
    }


И лучше это дело прогонять через DependencyInjection - инициализировать один раз при создании приложения и держать в памяти, чтобы не засорять код.

/*Где-то где инициализируются все сервисы приложения(где-то в корне) Я здесь использую autofac*/
C#
1
2
3
4
5
var builder = new ContainerBuilder();
builder.Register(cfg => AutomapperProfileConfig.SetupMappings()).AsSelf().SingleInstance();
builder.Register(cfg => cfg.Resolve<MapperConfiguration>().CreateMapper(cfg.Resolve)).As<IMapper>()
                .InstancePerLifetimeScope();
ServiceLocator.SetLocatorProvider(() => new AutofacServiceLocator(builder.Build()));
Далее, создаёте свой контроллер, наследуете от него те, где будет использоваться Mapping и прописываете в свой экземпляр вот это
C#
1
2
public IMapper Mapper =>
            Scope == null ? ServiceLocator.Current.GetInstance<IMapper>() : Scope.Resolve<IMapper>();
В итоге, маппинг делается так(например):
C#
1
CustomerDTO _customerDTO = Mapper.Map<CustomerDTO>(customerVM);
Это что касается только мапперов - если уже начали применять, то используйте их тоже правильно.
0
2370 / 1832 / 330
Регистрация: 22.07.2011
Сообщений: 7,025
17.09.2019, 09:18 20
Dimasta1488, следуйте SRP принципу.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2019, 09:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Архитектура MVC приложения
Добрый день. Уже несколько дней думаю над архитектурой будущего веб- приложения и никак не могу...

Архитектура веб сайта и парсинга фотографий
Доброго времени суток! Помогите придумать архитектурное решение для веб сайта (ASP.NET MVC 4)....

Архитектура приложения ASP.NET MVC 5 + Angular 2
Здравствуйте. К примеру, мы делаем на стороне сервера два контроллера HomeController (клиентская...

Архитектура для сайта учета пациентов клиники
Коллеги, посоветуйте, архитектуру для проекта MVC asp.net, по слоям приложения, для программы учета...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.