powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Грамотная архитектура приложения на ASP.NET MVC
25 сообщений из 167, страница 1 из 7
Грамотная архитектура приложения на ASP.NET MVC
    #38304267
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, уважаемые!

Делаю приложение на ASP.NET MVC из 2-ух проектов:
1-ый для работы с БД, так называемый Репозиторий. В нём функции выдающие данные и сохраняющие их.
2-ой для всего остального: т.е. для Контроллеров, Моделей представлений, Представлений.
Постепенно методы контроллеров загромоздились логикой приложения, стали очень большими, трудными для восприятия.

Может, правильно будет добавить 3-й проект, чисто для логики приложения? Чтобы он связывался с Репозиторием.
А проект для web-интерфейса, чтоб ничего про Репозиторий не знал, вызывал бы только методы приекта-логики.

Как грамотно построить приложение?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304345
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_VPМожет, правильно будет добавить 3-й проект, чисто для логики приложения?
Можно проект, можно неймспейс, зависит от масштаба.
Расслаивать логику это правильно.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304353
cooldeveloper2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey_VPА проект для web-интерфейса, чтоб ничего про Репозиторий не знал, вызывал бы только методы приекта-логики.
1. Так не надо делать. Зачем дублировать в болшьей части доступ к данным, особенно если это касается банальных CRUD.
2. Приложение должно общаться и с репозиторием (датасервисом) и с сервисом логики.
3. Сервис логики, как уже сказали, можно размещать как в отдельной сборке, так и в отдельном неймспейсе твоего репозитория (датасервиса).
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304435
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы!
Но есть один затык.

Логика приложения тесно общается с Репозиторием.
Связь с Репозиторием я поддерживаю через DI Ninject, слелав его DefaultControllerFactory (я получаю доступ к Репозиторию в конструкторе контроллера).

Если же я вынесу логику за пределы контроллера, то как сделать её общение с Репозиторием?
Мне бы хотелось прямо в логике работать с БД.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304457
cooldeveloper2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Делаешь базовый контроллер
2. В нём прокидываешь 2 ленивых свойства

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
private IDataService _ds;
public IDataService DataService
{
    get
    {
        if (_ds == null)
        {
            _ds = DependencyResolver.Current.GetService<IDataService>();
        }

        return _ds;
    }
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
private ILogicService _ls;
public ILogicService LogicService
{
    get
    {
        if (_ls == null)
        {
            _ls = DependencyResolver.Current.GetService<ILogicService>();
        }

        return _ls;
    }
}



3. Всё. Все твои контроллеры могут общаться со слоем данных и со слоем логики. Никаких дефолтных фабрик, никакого мусора в конструкторах унаследованных контроллеров.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304467
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если я перенесу логику в сборку Репозитория, тогда я не смогу получить доступ к моделям представления.
(Многие методы логики возвращают модель или List<модель> представления).
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304517
cooldeveloper2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey_VPА если я перенесу логику в сборку Репозитория, тогда я не смогу получить доступ к моделям представления.
(Многие методы логики возвращают модель или List<модель> представления).
1. Моделям представления вообще нечего делать в репозитории - это уровень твоего mvc приложения. Ты должен маппить в контроллере выхлоп от репозитория в модель представления и скармливать её во вью.
2. Возвращать List<T> дурной тон. Используй подобное в реализации, а наружу в сигнатуры тащи IEnumerable или IList.
3. Методы логики могут возвращать IEnumerable<T>, да. А контроллер должен это отдавать в модель пресставления.

Код: c#
1.
2.
3.
4.
5.
public class EmployeesViewModel
{
    public string Title { get; set; }
    public IEnumerable<Employee> Employees { get; set; }
}
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304620
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_VPЛогика приложения тесно общается с Репозиторием.Вот и вынеси работу с репозиторием в отдельный слой логики. В MVC это называется Model
Контроллер ничего не должен знать о репозитории, только о модели (слой логики).

Пример:
Код: 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.
public class PageController : ControllerBase
{
    private readonly IPageConverter pageConverter;
    private readonly IPageService pageService;

    public PageController(IPageConverter pageConverter, IPageService pageService)
    {
        this.pageConverter = pageConverter;
        this.pageService = pageService;
    }

    [HttpPost]
    public ActionResult Save(ViewModel data)
    {
        try
        {
            IPage page = pageConverter.ToPage(data.Page);

            pageService.Save(page);
        
            return SuccessActionResult(page.Id);
        }
        catch (Exception ex)
        {
            return FailActionResult(ex);
        }        
    }
}


IPage и IPageService - это Model (слой логики), IPageConverter - это mapper из Model во ViewModel и обратно.

Пример реализации IPageService:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class PageService : IPageService
{
    private readonly IPageRepository repository;

    public PageService(IPageRepository repository)
    {
        this.repository = repository;
    }

    public void Save(IPage page)
    {
        // Тут какая-то логика

        this.repository.Save(page);
        
        // Тут какая-то логика
    }
}
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304639
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_VPМногие методы логики возвращают модель или List<модель> представления.
cooldeveloper2Ты должен маппить в контроллере выхлоп от репозитория модели в модель представления и скармливать её во вью.
+1

В MVC (Model View Controller) логика == Model. То есть методы логики НЕ могут возвращать модель представления.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304669
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что касается неймспейсов, то IPage, IPageService, их реализации: Page и PageService, - а также IPageRepository - это
Код: c#
1.
namespace MyApplication.Model


а конкретная реализация IPageRepository - это или
Код: c#
1.
namespace MyApplication.Data.SqlServer

или
Код: c#
1.
namespace MyApplication.Data.Cache

или
Код: c#
1.
namespace MyApplication.Data.MongoDB

или
Код: c#
1.
namespace MyApplication.Data.SomthingElse
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304682
cooldeveloper2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAAndrey_VPМногие методы логики возвращают модель или List<модель> представления.
cooldeveloper2Ты должен маппить в контроллере выхлоп от репозитория модели в модель представления и скармливать её во вью.
+1

В MVC (Model View Controller) логика == Model. То есть методы логики НЕ могут возвращать модель представления.

Догика может находиться в репозитории (датасервисе). Контроллер может обращаться к репозиторию (датасервису) через IoC, забирать результат и намапливать на модель представления.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304689
cooldeveloper2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
[HttpGet]
public ActionResult DataView(int id)
{
    var item = base.Service.GetDataView(id);
    var views = new[] { Constants.ComboBoxEmpty }.Union(base.Service.GetSystemViews());
    var model = base.Mapper.Map<DataViewModel>(item);
    model.SystemViews = views;
            
    return PartialView("DataViewPropertyDialog", model);
}
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304703
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cooldeveloper2Догика может находиться в репозитории (датасервисе). Контроллер может обращаться к репозиторию (датасервису) через IoC, забирать результат и намапливать на модель представления.О какой логике речь? В MVC бизнес-логика - это Model. А репозиторий инкапсулирует логику работы с данными и их распределением.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304706
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA, что-то я запутался. Прошу учесть, что я ещё новичок в этом.

У меня сложилось мнение, что модель представления - это всего лишь описание передаваемых в представление данных, вроде:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
namespace Eru.WebUI.Models
{
    public class ProcessMenuViewModel
    {
        public int ID_Test { get; set; }
        public string Status { get; set; }
        public string RefreshDT { get; set; }
        public bool btnBeginMove { get; set; }
        public List<UForView> uListForView { get; set; }
    }
}



А Вы пишите, что логику, включая работу с Репозиторием, надо писать в модели.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304716
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_VP, вы не путайте модель и модель представления. Это две разные вещи.
Насчёт модели представления Вы всё правильно поняли. Но Вы не разобрались, что такое Model в MVC.
Почитайте хотя бы ВикипедиЮ: Model-View-Controller .
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304741
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA, почему "методы логики НЕ могут возвращать модель представления." ?

Вот например:
[HttpPost] метод контроллера получил модель представления.
Мне её надо как-то обработать, и уже модифицированную послать обратно в представление.

Модификация - это и есть логика.
Результат модификации - модель представления.

А раз логика - это модель, то почему "методы логики НЕ могут возвращать модель представления." ?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304747
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_VP, приведи пример кода контроллера, где формируется то, что ты называешь моделью представления.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304757
cooldeveloper2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAcooldeveloper2Догика может находиться в репозитории (датасервисе). Контроллер может обращаться к репозиторию (датасервису) через IoC, забирать результат и намапливать на модель представления.О какой логике речь? В MVC бизнес-логика - это Model. А репозиторий инкапсулирует логику работы с данными и их распределением.
О логике работе с данными. А логику в терминах MVC можно и в представлении сделать.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304780
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
Код: c#
1.
IPage page = pageConverter.ToPage(data.Page);



А в каком слое у вас маппинг (IPageConverter) ?

Как происходит общение между слоями?
К примеру:
DbModel => DTO => ViewModel
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304781
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cooldeveloper2skyANAпропущено...
О какой логике речь? В MVC бизнес-логика - это Model. А репозиторий инкапсулирует логику работы с данными и их распределением.
О логике работе с данными. А логику в терминах MVC можно и в представлении сделать.Ясно. Я же предлагаю "логику в терминах MVC" из контроллера вынести в модель (Model), куда же и знание о каком-то там репозитории переедет.

Выдержка из статьи , что я упоминал выше.Наиболее частые ошибкиНачинающие программисты (особенно в веб-программировании, где аббревиатура MVC стала популярна) очень часто трактуют архитектурную модель MVC как пассивную модель MVC. В этом случае модель выступает исключительно совокупностью функций для доступа к данным, а контроллер содержит бизнес-логику. В результате код моделей по факту является средством получения данных из СУБД, а контроллер представляет собой типичный модуль, наполненный бизнес-логикой, или скрипт в терминологии веб-программирования. В результате такого понимания MVC разработчики стали писать код, который Pádraic Brady, известный в кругах сообщества Zend Framework, охарактеризовал как ТТУК — «Толстые тупые уродливые контроллеры» (Fat Stupid Ugly Controllers)[6]:
Среднестатистический ТТУК получал данные из БД (используя уровень абстракции базы данных, делая вид, что это модель) или манипулировал, проверял, записывал, а также передавал данные в вид. Такой подход стал очень популярен потому, что использование таких контроллеров похоже на классическую практику использования отдельного php-файла для каждой страницы приложения.Но в объектно-ориентированном программировании используется активная модель MVC, где модель — это не только совокупность кода доступа к данным и СУБД, а вся бизнес-логика. В свою очередь, контроллеры представляют собой лишь элементы системы, в чьи непосредственные обязанности входит приём данных из запроса и передача их другим элементам системы. Только в этом случае контроллер становится «тонким» и выполняет исключительно функцию связующего звена (glue layer) между отдельными компонентами системы.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304782
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA, ну хотя бы вот:
Код: c#
1.
2.
3.
4.
5.
[HttpGet]
public ActionResult Menu(int id_ga)
{
     return PartialView(getProcessMenuViewModel(id_ga));
}



Сейчас getProcessMenuViewModel - это privat метод этого же контроллера:
Код: 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.
private ProcessMenuViewModel getProcessMenuViewModel(int id_ga)
        {
            Ga ga = gaRepository.GaList( id_ga).FirstOrDefault();

            bool btnBegMov=false;
            if (ga.Status=="Move" && ga.Status2=="wait" && ga.Mover==this.User.Identity.Name)
                btnBegMov=true;

            string s = StatusRUS(ga, this.User.Identity.Name);

            var ga2 = gaRepository.Ga2List(id_ga).ToList<Ga2>();
            List<UForView> UL = new List<UForView>();
            int T;
            foreach (Ga2 g2 in ga2)
            {
                var listW = gaRepository.WordList(id_ga, g2.U);
                if (listW.Count()==0)
                    T = 0;
                else
                    T = listW.Sum(w => w.Cost);
                UL.Add(new UForView
                    {
                        U = g2.U,
                        Total = T,
                        IDName = ga.Mover == g2.U ? "selected" :""
                    }
                );
            }
                    
            return new ProcessMenuViewModel
                {
                    ID_Ga = id_ga,
                    RefreshDT = "Состояние на " + DateTime.UtcNow.AddHours(4),
                    Status = s,
                    btnBeginMove = btnBegMov,
                    uListForView=UL
                };
        }
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304812
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_VP, ну и наименования классов и переменных Вы используете. Хрен прочитаешь код.

Насколько я могу судить, классы Ga, Ga2 и gaRepository - это у Вас Model (может gaRepository и нет, тут надо смотреть его реализацию).
Код, что Вы привели - это mapping модели (Model) в модель представления (ViewModel).

В моём примере этот mapping вынесен в IPageConverter.
Код: c#
1.
namespace MyApplication.Presentation.ViewModel

То есть это слой представления.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304822
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAAndrey_VP, ну и наименования классов и переменных Вы используете. Хрен прочитаешь код.

Насколько я могу судить, классы Ga, Ga2 и gaRepository - это у Вас Model (может gaRepository и нет, тут надо смотреть его реализацию).
Код, что Вы привели - это mapping модели (Model) в модель представления (ViewModel).

В моём примере этот mapping вынесен в IPageConverter.
Код: c#
1.
namespace MyApplication.Presentation.ViewModel

То есть это слой представления.

В таком случае БЛ просачивается в слой представления.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304833
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_VP,

идеальным для себя нашёл следующий подход:

1. MyProject — веб-приложение
2. MyProject.Data — данные
3. MyProject.Data.Access — доступ к данным
4. MyProject.Infrastructure — оснастка

...

суперпозиция:

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

— ни при каких условиях не должен существовать некий базовый сервис (IDataService), откуда будут доступны любые данные приложения

— сервисы доступа к данным ни при каких обстоятельствах не должны уметь сохранять изменения в данных, для этого должен быть отдельный сервис, IUnitOfWork

— слой данных не должен ничего знать о способе хранения данных, однако предоставляет интерфейсы доступа к данным, с которым слой данных работать в состоянии

— слой доступа к данным реализует интферфейсы слоя данных, касательно самого доступа, и не более того

— вся остастка, провайдеры, менеджеры, и прочие нужные классы уходят в Infrastructure, очищая содержание основного проекта до минимума

— Unit тесты!!!
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304834
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон, я не считаю mapping из Model во ViewModel бизнес-логикой.
...
Рейтинг: 0 / 0
25 сообщений из 167, страница 1 из 7
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Грамотная архитектура приложения на ASP.NET MVC
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]