powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Грамотная архитектура приложения на ASP.NET MVC
167 сообщений из 167, показаны все 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
Грамотная архитектура приложения на ASP.NET MVC
    #38304885
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПарамон, я не считаю mapping из Model во ViewModel бизнес-логикой.
Так все это к бизнесу отношения не имеет?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 
...
            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);
                );
            }
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304900
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA, Вы написали, что getProcessMenuViewModel - это слой представления.
Что это значит? Убрать из контроллера в отдельный класс?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304908
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Парамон, в приведённом Вами месте идёт подсчёт баллов у участников теста.
Я тоже за то, что это БЛ.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38304922
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_VPПарамон, в приведённом Вами месте идёт подсчёт баллов у участников теста.
Я тоже за то, что это БЛ.

по хорошему там должно быть нечто вроде:

Код: c#
1.
T = blService.GetCostSum();


То есть маппинг работает с БЛ слоем.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38305016
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
+1)
детский сад! коммент о своем владельце говорит о многом
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38305041
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонskyANAПарамон, я не считаю mapping из Model во ViewModel бизнес-логикой.
Так все это к бизнесу отношения не имеет?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 
...
            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);
                );
            }

Я не так внимательно разбирался в коде автора, как Вы. По его мнению - это бизнес-логика.
Не вопрос. Где ей место я вроде достаточно ясно объяснил.

То есть часть кода автора должна быть пересена в класс маппинга из Model во ViewModel, часть в модель Model.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38305096
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем большое спасибо за просвещение!
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38315829
Lamo2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня тоже есть вопрос по архитектуре приложения на ASP.NET MVC, поэтому чтобы не плодить темы, напишу его сюда.
У меня есть некоторый объект данных (модель) : EntityObject, который представляет собой пользователя системы, Customer. С ним связана сущность CustomerPenalty, которая доступна в нем как свойство-коллекция Penalties. Мне нужно в представлении вывести все пенальти кастомера, у которых дата истечения меньше чем, допустим, сегодня.
Какой вариант правильный:
1) Передать экземпляр кастомера (или его Penalties) как модель в представление и уже в нем сделать что-то вроде:
Код: c#
1.
2.
3.
4.
5.
@foreach (var item in Model.Penalties)
                {
                    var dateTo = item.CreatedDate + new TimeSpan(item.Duration);
                    if (dateTo.Date < DateTime.Now.Date) { continue; }
                    //.........



2) Отфильтровать коллекцию Penalties по нужным критериям в действии контроллера и передать IEnumerable<CustomerPenalty> как модель в представление.
3) Ваш вариант.

Как поступить правильно?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316069
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lamo2012, представьте, что потребуется предоставить пользователю возможность определять критерии фильтрации и сортировки.
Где Вы реализуете методы обработки и применения этих критериев?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316112
Lamo2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

Значит 2.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316126
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lamo2012,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
// Model
public class PenaltiesRepo
{
     public IEnumerable<Penality> GetPenlities()
     {
          return Model.Penalties.Where(t => t.CreatedDate <= DateTime.Now());
     }
}

// Controller
var penRepo = new PenaltiesRepo();
var castModel = new CustomreViewModel
{
    PenaltiesList = penRepo.GetPenlities(),
    Customer = "Some Name"
}
return View(castModel);



Схематично как то так.
Важно - получать из базы уже отфильтрованные данные.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316149
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон[src C#]
// Controller
var penRepo = new PenaltiesRepo();
-1

public class PenaltiesController : Controller
{
private >>>IPenaltiesRepo<<< Repo;

[DefaultConstructor]
public PenaltiesController(>>>IPenaltiesRepo<<< repo)
{
this.Repo= repo;
}

...
var castModel = new CustomreViewModel
{
PenaltiesList = this.Repo.GetPenlities(),
Customer = "Some Name"
}

return View(castModel);
}
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316151
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон
Код: c#
1.
2.
// Controller
var penRepo = new PenaltiesRepo();


-1

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public class PenaltiesController : Controller
{
    private IPenaltiesRepo Repo;

    [DefaultConstructor]
    public PenaltiesController(IPenaltiesRepo repo)
    {
        this.Repo= repo;
    }

    ...
    var castModel = new CustomreViewModel
    {
        PenaltiesList = this.Repo.GetPenlities(),
        Customer = "Some Name"
    }
    
    return View(castModel);
}
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316188
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонСхематично как то так.
Код: c#
1.
2.
3.
4.
5.
6.
7.
public class PenaltiesRepo
{
     public IEnumerable<Penality> GetPenlities()
     {
          return Model.Penalties.Where(t => t.CreatedDate <= DateTime.Now());
     }
}

Что есть Model внутри реализации репозитория? И почему объект query захардкожен?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316204
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Не обязательно, автор на простых примерах поймет лучше.
Не нужно его про зависимости грузить.

skyANAЧто есть Model внутри реализации репозитория? И почему объект query захардкожен?
1. датаконтекст
2. где там хардкод?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316226
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон2. где там хардкод?
Код: c#
1.
t => t.CreatedDate <= DateTime.Now()
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316247
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

проблема здесь не в «хардкоде», а в DateTime.Now
кстати да, почему хардкод?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316249
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
Код: c#
1.
t => t.CreatedDate <= DateTime.Now()


Почему это хардкод? По вашему дату нужно только передавать?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316258
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttпроблема здесь не в «хардкоде», а в DateTime.Now
кстати да
Проблема, что это - "сейчас", а не "сегодня" ? )
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316260
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон,

проблема в том, то все люди не живут в одном часовом поясе, при разработке веб-приложений про DateTime.Now надо забыть навсегда, и не использовать даже в примерах :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316268
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонskyANA
Код: c#
1.
t => t.CreatedDate <= DateTime.Now()


Почему это хардкод? По вашему дату нужно только передавать?Не дату, а условие, condition, query.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class PenaltyRepository
{
     public IEnumerable<Penalty> FindAll()
     {
          // возвращаем всё
     }

     public IEnumerable<Penalty> Find(IQueryObject query)
     {
          // возвращаем только те данные, что удовлетворяют условию
     }
}
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316281
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttпроблема в том, то все люди не живут в одном часовом поясе, при разработке веб-приложений про DateTime.Now надо забыть навсегда, и не использовать даже в примерах :)
DateTime.Now активно и хорошо используется, про локализацию отдельная тема.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316303
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class PenaltyRepository
{
     public IEnumerable<Penalty> FindAll()
     {
          // возвращаем всё
     }

     public IEnumerable<Penalty> Find(IQueryObject query)
     {
          // возвращаем только те данные, что удовлетворяют условию
     }
}



Бывают методы и без входящих параметров :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316357
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонhVosttпроблема в том, то все люди не живут в одном часовом поясе, при разработке веб-приложений про DateTime.Now надо забыть навсегда, и не использовать даже в примерах :)
DateTime.Now активно и хорошо используется, про локализацию отдельная тема.

локализация? О_о

DateTime.Now используется не от большого ума. либо DateTime.UtcNow, либо DateTimeOffset.Now и точка.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316468
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

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

Не обязательно, автор на простых примерах поймет лучше.
Не нужно его про зависимости грузить.

skyANAЧто есть Model внутри реализации репозитория? И почему объект query захардкожен?
1. датаконтекст
2. где там хардкод?
А почему ты получаешь IQueryable и ретурнишь его? А где ты диспоузишь контекст?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316501
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонskyANA
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class PenaltyRepository
{
     public IEnumerable<Penalty> FindAll()
     {
          // возвращаем всё
     }

     public IEnumerable<Penalty> Find(IQueryObject query)
     {
          // возвращаем только те данные, что удовлетворяют условию
     }
}


Бывают методы и без входящих параметров :)
А ещё бывают методы без входных параметров и ниндзя-кода внутри :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316520
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУА почему ты получаешь IQueryable и ретурнишь его? А где ты диспоузишь контекст?
1. IQueryable конвертится в IEnumerable, типа нужна форвард онли коллекция с отложенной загрузкой.
2. Соединение закрывается автоматом, остальное сборщик заметает.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316596
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонМСУА почему ты получаешь IQueryable и ретурнишь его? А где ты диспоузишь контекст?
1. IQueryable конвертится в IEnumerable, типа нужна форвард онли коллекция с отложенной загрузкой.
2. Соединение закрывается автоматом, остальное сборщик заметает.
1. Твой пример "IQueryable cast to IEnumerable" всё-равно не считывает данные с таблицы. Зачем тебе отложенный IQueryable, который на самом деле скрыт за IEnumerable? Странный неочевидный подход, который вызывает больше путаницы. Обычно принято отдавать IEnumerable как прочитанную коллекцию данных с БД. Если нужно отложенное чтение, то для этого есть честный IQueryable, который и нужно прокидывать. Странно это всё...
2. Плохой подход. Диспоузить нужно всё, что реализовано от IDisposable. Закон, который не требует комментариев.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316838
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

1. согласен, стоит отдавать прочитанную коллекцию.
2. EF сам диспозит или GC на край, но обычно деалю MyRepository : IDisposable

Вот где dispose в этом букварике? )
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38316858
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон2. EF сам диспозит или GC на край
EF ничего не диспоузит. Зачем ожидать сборщика, если можно освободить ресурс тогда, когда он не нужен? Сборщик может быть занят другими более важными делами, зачем растягивать память и накручивать ссылки в куче? Твой репозиторий может работать и с более трудозатратным ресурсом, напр. открытое соединение в веб сервисом.

ПарамонВот где dispose в этом букварике? )
Суть этого примера заключается не в том, чтобы показать, как работать с освобождением ресурсов и IoC. Поэтому не нужно надеяться на наличие полной картины архитектуры кода.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38323792
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем привет. небольшой вопрос для обсуждения по поводу архитектуры.
если построить в asp.net приложении слой, работающий с данными, на базе entity или linq 2 sql (с репозиторием или без) то естественно в приложении это слой будет работать с экземплярами классов Entity - соответстсвие между таблицей в БД и классом C# в проекте.
вопрос - стоит ли эти классы использовать как классы модели или нужно для модели делать свою реализацию экземпляров модели?
тут что смущает
1. такой класс модели будет сильно похож на класс Entity
2. но одинаковыми они не будут - то есть если в базе есть запись о пользователе User (login, email), то в модели может быть так описана запись о пользователе UserInfo(login, email, displayName), где displayName = login ?? email.
3. наличие классов модели , отличных от объектов Entity позволит использовать их в любой библиотеке, где нужно работать с классами модели и не нужен доступ к БД
4. если приложение работает со слоем, который отдает классы модели, отличные от entity (например скрыто за фасадом), и внутри слоя приложение работает с объектами entity,то это позволит в случае необходимости поменять логику работы слоя с данными на xml, и не трогать реализацию web приложения
5. наличие разных объктов слоя доступа к данным и слоя модели требует создания двунаправленного конвертора, а это может быть довольно много.
так что стоит разделять классы, представляющие объекты БД и классы модели - у кого какой опыт и какое мнение на это счет ?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38323895
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё зависит от масштаба бедствия.
Если приложение будет активно развиваться, обрастать внешним API, сервисами и интеграцией со сторонними системами, то разделять.
А ежели написали, работает и забыли, то можно и не заморачиваться.

И кстати в EF жеж добавили возможность работы с так называемыми сущностями POCO .
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38323939
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В РБД модель размыта на множество связанных таблиц, посему у меня модели сгенеренные в EF, в основном используются только для составления запросов. Типа DAL и все.
Модель у меня anemic )
В представление отдаю только вью модели.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38323999
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrU,

с самого старта проекта удобно накидывать черновой прототип, используя DAL классы напрямую, без обёртывания во вью-модель, если конечно не требуется собирать разрозненные данные в кучу, или раскидывать по нормалям формы. но в итоге всё сводится к вью-моделям. в какой-то альфа-бете вью уже не видят классов из DAL и не подозревают об их существовании.

на счет маппинга. существуют хорошие библиотеки (например, Automapper), позволяющие рутину свести к минимуму. кроме того, проводить логику связывания DAL-ViewModel хорошо в одном месте, снимая груз лишней ответственности с контроллеров.

одна из основных задач в проектировании — свести к минимуму ответственность отдельных компонентов. контроллеры должны быть на столько легкими (можно даже сказать, тупыми), на сколько это вообще возможно, если мы говорим о модели MVC конечно же.

ну и т.д. by design — ему нужно быть, хоть какому-то :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324003
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

это уже давно не просто возможность. это целая инфраструктура. Code First же.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324060
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот прям очень хороший набор простых рекомендаций от вяндора:

https://wiki.asp.net/page.aspx/1014/aspnet-mvc-best-practices/

советую.

Isolate Controllers

Isolate the controllers from dependencies on HttpContext, data access classes , configuration, logging etc. Isolation could be achieved by creating wrapper classes and using an IOC container for passing in these dependencies
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324107
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt кроме того, проводить логику связывания DAL-ViewModel хорошо в одном месте, снимая груз лишней ответственности с контроллеров.

У вас на этом уровне есть запросы к базе, или DAL возвращает какие-то DTO?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324108
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttпроводить логику связывания DAL-ViewModel хорошо в одном местеЧто это за логика такая? Будь любезен, приведи пример.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324111
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttэто уже давно не просто возможность. это целая инфраструктура. Code First же.Я не пользуюсь EF, для меня это просто возможность. :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324164
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон, skyANA,

упрощенный до безобразия пример:

Код: 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 MyAction(...)
{
     var data = _service.Get(...);
     var model = Mapper.Map(data, new MyViewModel());
     return View(model);
}

[HttpPost]
public ActionResult MyAction(MyViewModel model)
{
     if(ModelState.IsValid)
     {
          var data = _service.Get(...);
          // check exists data...
          try {
               Mapper.Map(model, data);
               _service.Update(...);
               _unitOfWork.Save();
               return Redirect...
          }
          catch(...)
          {
              ...
          }
     }
     return View(model);
}



конфигурация Mapper в отдельно слое. если что-то требуется по-сложнее, то и конфигуратор настраивается соответствующим образом. таким образом, вью-модели могут быть вложенными, и код контроллера лишается лишних обязанностей, и как следствие зависимостей.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324171
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, если _service у тебя DAL, то где слой бизнес-логики? Если при этом ещё и контроллер тупой. :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324194
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
В общем это слой маппинга.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324196
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVostt, если _service у тебя DAL, то где слой бизнес-логики? Если при этом ещё и контроллер тупой. :)

_service — и есть слой бизнес-логики. в примере он выглядит как простой DAL, ну так пусть воображение дорисует _service.GetAndDoSomethingWithMyBusiness(...)

сам же объектъ _service работает с IXXXRepository, ничего идеологически не нарушено :) и да, сервису совсем не обязательно дублировать репу, достаточно выставить интерфейс репы наружу.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324219
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt ну так пусть воображение дорисует _service.GetAndDoSomethingWithMyBusiness(...)

Мое дорисовывает целый слой DTO, а у вас там что передают?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324243
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон,

а у меня там domain business layer transfer data object и business-logic flow, не пугайте людей :) человек же учится...
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324303
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, это ты человека не путай своим DAL - ViewModel, тогда как у тебя из DAL - Model, Model - ViewModel.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324310
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

ах вон вы про что. ну ладно, ладно :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324323
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttах вон вы про что. ну ладно, ладно :)Чего ладно? Ты читать пробовал, что пишешь?
hVosttс самого старта проекта удобно накидывать черновой прототип, используя DAL классы напрямую, без обёртывания во вью-модель, если конечно не требуется собирать разрозненные данные в кучу, или раскидывать по нормалям формы. но в итоге всё сводится к вью-моделям. в какой-то альфа-бете вью уже не видят классов из DAL и не подозревают об их существовании.
У нормальных людей DAL классы - это DAL классы. А у тебя фиг знает что, судя по твоим последующим постам. То ли ты их просто везде используешь.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324347
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

по-подробней про DAL-классы пожалуйста. просвятите несведущих
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324374
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, конкретные вопросы будут?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324387
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVostt, конкретные вопросы будут?

У нормальных людей DAL классы - это DAL классы.

что за DAL классы такие у нормальных людей, и какие видятся несостыковки с тем, что написал я?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324529
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, DAL классы - это те классы, что используются на уровне доступа к данным и за пределами репозитория их не видно.
На языке EF - это означает, что репозиторий не должен возвращать сущности, завязанные на EntityObject и ObjectContext.

Нестыковки у тебя в том, что до конца не понятно, что возвращает твой _service и избавился ли ты от использования DAL классов в представлении и контроллере.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324578
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

всё правильно. DAL не светит на ружу Data Context-ом.

пример структуры размещения:

сборка MyProj.Data
— содержит определения классов модели (кот. в тоже время являются DTO)
— ничего не знает о DataContext и Entity Framework
— содержит интерфейс IRepository
— содержит публичный интферейс IXXXService и закрытую (internal) реализацию XXXService
— содержит публичный интерфейс IUnitOfWork

сборка MyProj.Data.Access
— референсит MyProj.Data и EF
— содержит реализацию Data Context
— реализует IRepository из MyProj.Data
— реализует IUnitOfWork


основной проект ссылается на обе сборки. регистрирует их как модули и работает исключительно с интерфейсами через IoC. в следствие этого Data.Access заменить можно (на что угодно, хоть на Redis реализацию), Data — заменить нельзя, так как это суть есть модель.

через IXXXService доступ к бизнес-логике. все операции над моделью XXX и связанными сущностями. через IUnitOfWork получаем доступ к сохранению изменений. если контроллер не владеет IUnitOfWork, он ни при каких обстоятельствах, что бы он не делал, не может произвести никаких изменений с моделью.

какие несостыковки? или вы предлагаете еще один слой классов Модели над DTO, а только затем уже ViewModel ?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324592
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

просто да, так получается, что классы domain модели являются DTO в EF Code First. и через навигационные свойства можно получить доступ к связанным объектам. и это огромный плюс. если на этом завязываться, то мы поимеем зависимость от такого поведения, которую не-EF может не реализовывать и придется реализовывать кастомно (хотя тот же BLToolkit это умеет из каропки и другие игроки тоже могут). правда, мне не приходилось работая с Code First на горячую менять ORM. базу данных можно легко поменять при наличии провайдера.

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

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

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

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

просто да, так получается, что классы domain модели являются DTO в EF Code First. и через навигационные свойства можно получить доступ к связанным объектам. и это огромный плюс. если на этом завязываться, то мы поимеем зависимость от такого поведения, которую не-EF может не реализовывать и придется реализовывать кастомно (хотя тот же BLToolkit это умеет из каропки и другие игроки тоже могут). правда, мне не приходилось работая с Code First на горячую менять ORM. базу данных можно легко поменять при наличии провайдера.

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

что здесь плохо? может посоветуете, что можно улучшить?Я не понял, у тебя объекты завязанны на EF, или таки нет?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324709
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

MyProj.Data совершенно ничего не знает о EF (нет референса), а работаю из проекта я именно с ним.

хотя и Business Objects выглядят примерно вот так:

public class Order
{
...
[MaxLength(Basis.Number)]
public string Number {get;set;}
...
public virtual ICollection<Service> Services { get; set;}
...
}

что какбы намекает :) но прямой взаимосвязи нет, только соглашения (для удобства, но это вовсе не обязательно). конечно из DAL я получаю на самом деле инстанс прокси-класса (заэммиченный наследник Order, реализующий Lazy-навигационные свойства) — это щитается?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324837
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANA,

всё правильно. DAL не светит на ружу Data Context-ом.

пример структуры размещения:

сборка MyProj.Data
— содержит определения классов модели (кот. в тоже время являются DTO)
— ничего не знает о DataContext и Entity Framework
— содержит интерфейс IRepository
— содержит публичный интферейс IXXXService и закрытую (internal) реализацию XXXService
— содержит публичный интерфейс IUnitOfWork


то есть IRepository в этом случае у тебя работает с объектами модели?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38324839
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrU,

да Get, Query, Add, Update, Remove...
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325048
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

какой смысль одно и то ж дублировать на разных уровнях?
мыслишь в таблицах, так и работай с таблицами
модель блин, которая = таблица в БД в лучшем случае
какой то ДТО придумали от бессилия
ужость
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325157
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosмыслишь в таблицах, так и работай с таблицами

типа так ? )
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325164
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон,

а че? нормально, никаких левых абстракций ради абстракций
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325176
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

Когда-то так и было. С абстракциями порядка больше, багов меньше )
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325178
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttmonstrU,

да Get, Query, Add, Update, Remove...

Бред сивой кобылы репозиторий затачивать под дженерик от модели с лапидарными гет, апдейт и иже с ним. Тот же контекст еф уже обслуживает весь этот функционал и даже больше. Репозиторий или датасервис не должен зависеть от модели. Это полновесный слой.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325179
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos, о смысле шаблона Repository (Репозиторий) могли бы и прочитать.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325197
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУРепозиторий или датасервис не должен зависеть от модели. Это полновесный слой.Будь любезен, раскрой мысль.
"Не должен зависеть от модели" - это как?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325208
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAМСУРепозиторий или датасервис не должен зависеть от модели. Это полновесный слой.Будь любезен, раскрой мысль.
"Не должен зависеть от модели" - это как?
Я же раскрыл уже. Речь о генерик репозитории. Раскрыть мысль, что такое генерик?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325287
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ, а, понял, ты под моделью ты понимаешь отдельную сущность?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325302
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

вот вот
че за Модель то?
потеряв месяц на изучение всего этого барахла понял что "модель" это та фигня, которая передается для визуализации
все крутится вокруг - как бы че нить показать и при том показать хреновенько :(
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325326
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosвот вот
че за Модель то?
потеряв месяц на изучение всего этого барахла понял что "модель" это та фигня, которая передается для визуализации
все крутится вокруг - как бы че нить показать и при том показать хреновенько :(ВикипедиЯКонцепция MVC позволяет разделить данные, представление и обработку действий пользователя на три отдельных компонента:
- Модель (англ. Model). Модель предоставляет знания: данные и методы работы с этими данными, реагирует на запросы, изменяя своё состояние. Не содержит информации, как эти знания можно визуализировать.
- Представление, вид (англ. View). Отвечает за отображение информации (визуализацию). Часто в качестве представления выступает форма (окно) с графическими элементами.
- Контроллер (англ. Controller). Обеспечивает связь между пользователем и системой: контролирует ввод данных пользователем и использует модель и представление для реализации необходимой реакции.
Вы потратили месяц на то, чтобы понять, что в представление передаётся информация, которую надо отобразить (визуализировать)?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325328
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosче за Модель то?

Да, тут часто непонятки, EF model, MVC model, DATA model, View model, Business Model, Entity Model и тд.
Каждый своё поразумевает )
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325330
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

в АСП НЕТ МВС я не видель у модели никаких методов
под моделю подразумевается данные которые помешается во вьюдата и все
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325331
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонViPRosче за Модель то?

Да, тут часто непонятки, EF model, MVC model, DATA model, View model, Business Model, Entity Model и тд.
Каждый своё поразумевает )
во во
а Модель то воще то модель предметной области вроде бы
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325340
Фотография konstsch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напомните как в один солюшен добавить несколько проектов
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325343
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAВы потратили месяц на то, чтобы понять, что в представление передаётся информация, которую надо отобразить (визуализировать)?
Я потратил месяц на изучение стека АСП НЕТ и пришел к выводу что предел этой технологии ASP DynamicData :):)
т.е. отображение таблиц БД на рожу
скоко блабла, а в конце опять таблички из бд
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325350
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosskyANAВы потратили месяц на то, чтобы понять, что в представление передаётся информация, которую надо отобразить (визуализировать)?
Я потратил месяц на изучение стека АСП НЕТ и пришел к выводу что предел этой технологии ASP DynamicData :):)
т.е. отображение таблиц БД на рожу
скоко блабла, а в конце опять таблички из бдНу не знаю, почитайте книжку "Шаблоны интеграции корпоративных приложений" :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325353
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

да пофиг кто там че написал ради бабла
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325387
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosда пофиг кто там че написал ради баблаas you wish :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325394
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosа в конце опять таблички из бдЕсли данные хранятся только в одной реляционной бд, то да, сложно понять для нахуа понапридумывали шаблоны проектирования.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325427
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

не при чушь, при чем тут РМД
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325451
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos, перефразирую: "Если данные хранятся только в одной реляционной бд не распределены, то да, сложно понять для нахуа понапридумывали шаблоны проектирования репозиторий."
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325464
skyANAViPRos, перефразирую: "Если данные хранятся только в одной реляционной бд не распределены, то да, сложно понять для нахуа понапридумывали шаблоны проектирования репозиторий."Да, так лучше. А то опять глаза тереть начал:)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325491
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какие данные? почему распеределны так а не этак?
откуда блин эти догмы в башке?
нафига мне какой то репозитарий обязательно если данные распределены?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325522
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosкакие данные? почему распеределны так а не этак?
откуда блин эти догмы в башке?
нафига мне какой то репозитарий обязательно если данные распределены?Слушай. Прочитай опредление и попытайся понять о чём там речь.
Я же уже писал, что всё зависит от масштаба бедствия.
Где-то применение того, или иного шаблона - это лишняя абстракция. А где-то вполне логичное решение.

Ты ошибочно полагаешь, что у меня какие-то догмы в башке.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325534
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAМСУ, а, понял, ты под моделью ты понимаешь отдельную сущность?
Repository<T>

В данном случае репозиторий жестко прибивается к одной "модели". Для примеров hello world еще пойдет, но в реалиях такая жесть просто неприемлема.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325549
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ, один Repository на всех тоже плохо.
Рекомендуется, цитирую: отдельный объект Repository создавать только для корня агрегации (aggregation root), к которому нам нужен непосредственный доступ.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325555
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAМСУ, один Repository на всех тоже плохо.
Рекомндуется, цитирую: отдельный объект Repository создавать только для корня агрегации (aggregation root), к которому нам нужен непосредственный доступ.
Не на всех, на абстракцию. Например, EmployeeDataService сервис для работы с эмплоями, в котором не обязательно модель Employee должна ходить. Там может быть что угодно, в той или иной степени коррелирующее с эмплоями.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325599
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAМСУ, один Repository на всех тоже плохо.
Рекомендуется, цитирую: отдельный объект Repository создавать только для корня агрегации (aggregation root), к которому нам нужен непосредственный доступ.
а если корней много?
и как ты будешь определять какие корни и какие ветки?
где метаописание понятия? где OCL?
и кто воще все это рекомендует? на основе какого опыта?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325692
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos, сходите в гугл с запросом: "domain driven design aggregate root".
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325697
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коротко: aggregate root - это понятие логическое. Вон почитайте, что МСУ пишет.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325778
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

да мне то нефиг гуглить, мои макротипы лет 5 уже работают
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325837
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosда мне то нефиг гуглить, мои макротипы лет 5 уже работаютА DDD уже лет 10 с лишним.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325945
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

а коболу еще больше
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325947
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУskyANAМСУ, а, понял, ты под моделью ты понимаешь отдельную сущность?
Repository<T>

В данном случае репозиторий жестко прибивается к одной "модели". Для примеров hello world еще пойдет, но в реалиях такая жесть просто неприемлема.

бред сивой кобылы. интересно было бы посмотреть на репозиторий в твоих реалияхъ. но ты же не покажешь, зассикаешь.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38325956
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУБред сивой кобылы репозиторий затачивать под дженерик от модели с лапидарными гет, апдейт и иже с ним. Тот же контекст еф уже обслуживает весь этот функционал и даже больше. Репозиторий или датасервис не должен зависеть от модели. Это полновесный слой.


какой там функционал обслуживает еф контекст — до лампочки и до фонаря. даже если он при этом будет еще стирать носки и варить борщ. контекста еф вообще может и не быть, модель о нём совсем ничего не знает. поэтому не втыкай его куда попало.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326071
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, кроме безумного поноса, что-то по теме будет?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326073
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ, ты сам начал с фразы: "Бред сивой кобылы". Вот он тебе той же монетой и ответил.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326108
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

я по теме сказал очень много. если ты слепой, то тут уже ничем не поможешь. а твой репозиторий «в реалиях» мы так и не увидели. как я и предполагал, ты только языком ворочать можешь.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326116
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAМСУ, ты сам начал с фразы: "Бред сивой кобылы". Вот он тебе той же монетой и ответил.
Я объяснил, почему эти дженерик сервисы и репозитории идут лесом.

hVosttМСУ, я по теме сказал очень много. если ты слепой, то тут уже ничем не поможешь. а твой репозиторий «в реалиях» мы так и не увидели. как я и предполагал, ты только языком ворочать можешь.
Ты по теме промычал что-то невнятное про обобщенный слой. Я тебе сказал, что это годится только для детского сада. Что мне тебе еще нужно показывать?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326146
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

пока все это голословно. и ничего ты не объяснил. про aggregate root сущность было уже сказано, но ты видимо не в курсе о чем это, поэтому пихаешь все что попало, и дженерики тебе не подходят.

если что, то дженерики подходят к репо на все 100%, таким образом в самом обобщенном случае реализацией репы может выступать даже обычный List<T>, что крайне хорошо для тестирования, таким образом логика не размазывается и каждый класс совершенно точно знает с чем работает, и выполняет сугубо свою задача, на залезая не на чьё поле.

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

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

Ссылка была уже приведена, но я повторю: http://design-pattern.ru/patterns/repository.html

Цитата:

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

и оно понятно, сам термин Repository переводится, как «хранилище»

Почему здесь уместны generics? Давайте посмотрим типичное переопределения DataContext:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
	internal class DataContext : DbContext
	{
		public DataContext()
			: base("DefaultConnection")
		{ }

		public DataContext(string connectionName)
			: base(connectionName)
		{ }

		...

		public DbSet<Customer> Customers { get; set; }
		public DbSet<Order> Orders { get; set; }

		...
	}



В данном случае каждый DbSet<T> является репозиторием отдельной сущности. Если T имеет навигационные свойства, то через полученный объект/коллекцию, можно получить доступ к связанным объектам. Поэтому каждому отдельному репозиторию нет нужды предоставлять доп. набор методов для связанных сущностей. Правда и здесь не все так идеально, как хотелось бы. Remove() выполненный для коллекции навигационного свойства не является равнозначной инструкцией Remove() репозитория (объект не удаляется, а лишь уничтожается связь). Что логично, в принципе.

Для учебных примеров вроде сойдёт. Но теперь к боевым «реалиям».

Определяем интерфейс:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	public interface IRepository<T> 
		where T: class
	{
		int Count();
		T Get(int id);
		T Add(T entity);
		T Update(T entity);
		T Remove(T entity);
		IQueryable<T> Query { get; }
	}



Этого базиса хватит с головой для выполнения любых операций. Update технически не нужен для работы с EF, но должен присутствовать и использоваться.

Реализация для EF:

Код: 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.
	internal class Repository<TEntity> : IRepository<TEntity>
		where TEntity : class
	{

		public Repository(DbContext dbContext)
		{
			_dbSet = dbContext.Set<TEntity>();
		}

		protected IDbSet<TEntity> DbSet
		{
			get { return _dbSet; }
		}

		public TEntity Get(int id)
		{
			return DbSet.Find(id);
		}

		public TEntity Add(TEntity entity)
		{
			DbSet.Add(entity);
			return entity;
		}

		public TEntity Remove(TEntity entity)
		{
			return DbSet.Remove(entity);
		}

		public TEntity Update(TEntity entity)
		{
			// nothing...
			return entity;
		}

		public IQueryable<TEntity> Query
		{
			get { return DbSet; }
		}
	}



Плюсов в таком подходе достаточно:
0. Самое главное! Тестирование! Очень легко генерить коллекции и подсовывать их как источник данных.
1. Реализацию полностью можно подменить на любую другую, сменив не только базу данных, провайдер, но и ORM.
2. В отдельных случаях можно подменить реализацию репы одной сущности на другую, допустим какие-нибудь сверхогромные блобы могут храниться совсем в другой базе данных. Или отдельные данные должны храниться в более защищенном хранилище (особенно учитывая некоторые пункты Кодекса по обработке персональных данных)...
3. Можно изготовить фабрику, которая будет выдавать репу для любой запрошенной сущности, и это легко реализовать.

Далее. Расширение.

Код: c#
1.
2.
3.
4.
	public interface IOrderRepository : IRepository<Order>
	{
		IQueryable<Order> VeryHeavyRecursiveQuery(params);
	}



Поясню, никто не запрещает расширять репу кастомными методами, для оптимизации тех же тяжелых запросов (для которых возможностей LINQ может не хватать), в том числе если надо избавиться в некоторых случаях от Lazy-поведения.

Репозиторий должен делать только то, что должен: «достижение полного разделения и односторонней зависимости между уровнями области определения и распределения данных» .

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

Пытаться пихнуть на репу каких-то еще задач, выйдет боком для сопровождения, развития и самое главное — для тестирования. Дженерики здесь очень даже уместны. Есть возражения? Примеры плз.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326212
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще одно уточнение.

Если какому-то сервису треба работать с несколькими сущностями, радя бога:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
internal class OrderService
{
   public OrderService(
      IOrderRepository orderRepository, 
      ICustomerRepository customerRepository, 
      Lazy<IChosenOneRepository> chosenOneRepository)
   {
       _orderRepository = orderRepository;
       _customerRepository = customerRepository;
       _chosenOneRepository = chosenOneRepository;
   }

   ...

}



Если конструктор получается перегружен кучей зависимостей, значит в дизайне творится какая-то каша и требуется срочный рефакторинг.

Для приложения не должен существовать какой-то мега-сервис, напичканный доступом ко всем данным. Ни в коем случае. Если такое имеет место быть, архитектура однозначно плохая и оправданий этому не может быть.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326310
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕсть возражения? Примеры плз.Да. Смотри первые две проблемы тут .
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326327
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

проблем не вижу.

хотите, используйте спецификации (я использую). не хотите, делайте «фабрику запросов».

специфика DAL не вылазит за пределы репы, если этого не сделать умышленно (всякие IsChanged инкапсулируются в прокси, и без специальных методов доступ к ним не получить).

на счет того, делать или не делать специфичный репо для поголовно для каждого домена, согласен с принципом aggregation root, т.е. делать только для root, но с другой стороны, имя под рукой фабрику, генерирующую репу для домена, вообще проблем не имеем. делаем специфику там, где требуется. где не требуется, обходимся фабрикой или вылизываем архитектуру.

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

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

репа и UnitOfWork не связаны вообще никак. заботиться об этом не нужно, если правильно употреблять IoC. никаких затрапезных студенческих поделок типа using(...) { }

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

хотите, используйте спецификации (я использую). не хотите, делайте «фабрику запросов».У тебя полтора человека в команде?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326341
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

вот об этом и речь :) я использую, но не пишу. четкое разделение ответственности в коде, позволяет организовать работу команды, понимать и использовать наработки друг друга. если писать единоличный проект, там можно творить все щто угодно.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326356
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttUpdate технически не нужен для работы с EF, но должен присутствовать и использоваться.
А почему не нужен? Как и где он реализуется?

ps
При работе с DbContext напрягает вся эта тема с Property.IsModified.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326363
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕсли конструктор получается перегружен кучей зависимостей, значит в дизайне творится какая-то каша и требуется срочный рефакторинг.

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

Update не нужен, потому что изменения отслеживаются.

Update должен применяться, чтобы не зависеть от этого поведения.

если вы не хотите отслеживания (IsModified внутрях), можете получать объекты AsNoTracking().
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326393
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttесли вы не хотите отслеживания (IsModified внутрях), можете получать объекты AsNoTracking().
А если я не хочу получать объекты, а просто приаттачить по айди?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326442
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон,

интересен сам механизм, в результате которого вы хотите приатачить объект по айди. мне вот такого ни разу не потребовалось. если у меня есть айди, я получая объект, апдейчу его, затем сохраняю. зачем атачить? там щто пару тыщей полей? расходы на эту операцию в масштабах приложения вообще не существенны, это не то, на чем стоило бы экономить.

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

Да полно операций, которые выполняют чисто апдейт, таблица на 40 - 50 полей (полно nvarchar), есть нагрузка. Мне каждый раз делать селект перед этим? )
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326461
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

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

не зная реальной специфики и нагрузки, трудно сказать, почему бы и нет. функцию, которая опдейтит нужные данные (ч/з аттач или через процедуру) можно сделать, ничего не мешает.

если еще есть возможность проектировать/изменять схему данных, если полей так много стоит может задуматься уже и о нормировании :) видал я базы с таблицами over 200 полей. ниче так. я такие системы называю «системами поддержания работообеспечения персонала»
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326474
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRoshVostt,

нифига ты не понимаешь
репозитарий в твом примере один - dbcontext

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

только с ним и работаешь как токо начинается транзакция
так что все остальное нафиг не нужно
и не каждый dbcontext есть полноценный репозитарий (полноценный должен дать возможность зафиксировать любую транзакцию если нет конкурренции)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326483
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttПарамон,

не зная реальной специфики и нагрузки, трудно сказать, почему бы и нет. функцию, которая опдейтит нужные данные (ч/з аттач или через процедуру) можно сделать, ничего не мешает.

если еще есть возможность проектировать/изменять схему данных, если полей так много стоит может задуматься уже и о нормировании :) видал я базы с таблицами over 200 полей. ниче так. я такие системы называю «системами поддержания работообеспечения персонала»

Да я вижу сколько систем ты видел если, предлогаешь два обращения вместо одного.
Выходит прийдется нарушать концепцию и размазывать логику, а? :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326490
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

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

ничего идеального не бывает :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326499
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRos,

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

вернее слова то верные- а вот интерпетация - говно
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326510
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosкогда получиш уов твой, то заранее надо знать а зафиксируется ли оно :)
а ты нифига не знаешь

если не получу исключения, начит все зафиксировалось. может стоит еще манетку подбрасывать и гадать на луже?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326527
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

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

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

я и грю - не читайте дебилов - начиная с буча, кончая фулером
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326588
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosвернее слова то верные- а вот интерпетация - говноЭто твоя интерпретация - говно. У нас основное хранилище - это MS SqlServer, часть данных лежит в MongoDB, часть в Couchbase.
Репозиторий - это dbcontext, ну ну. Я же говорю, что пока у тебя данные не распределены, ты не поймёшь суть репозитория.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326593
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

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

дл блин это у него репозитарий дбконтекст а не у меня
и сунь свой моного и т.д. куда подальше инвалид фиговНажрался с утра, или кто нахер послал? Или просто остопиздело всё и бана захотелось?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326605
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С репозиторием опять непонятки.
У одних это обертка над конетекстом, у других там БЛ, у третих корень :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326613
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонС репозиторием опять непонятки.
У одних это обертка над конетекстом, у других там БЛ, у третих корень :)Эээ, жолубчик, определение прочитай.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326616
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сахават, я буду тыкать тем, чем считаю нужным.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326621
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAопределение прочитай.
Прослойка между прослойками не? :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326626
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон, можно и так сказать.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326629
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прослойка, посредник, медиатор...
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326657
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

хто то сказал, слойка? :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38327013
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУ, пока все это голословно. и ничего ты не объяснил. про aggregate root сущность было уже сказано, но ты видимо не в курсе о чем это, поэтому пихаешь все что попало, и дженерики тебе не подходят.
Ты либо в космосе, либо читать не умеешь. 14542061 Впрочем, как всегда.

hVosttесли что, то дженерики подходят к репо на все 100%
Для задач Hello world, бесспорно.

hVosttтаким образом в самом обобщенном случае реализацией репы может выступать даже обычный List<T>, что крайне хорошо для тестирования, таким образом логика не размазывается и каждый класс совершенно точно знает с чем работает, и выполняет сугубо свою задача, на залезая не на чьё поле.
Ничего не понял. Ты как в тумане. Какой List, причем тут тестирование, о каком размазывании идет речь?

hVosttвсе, что выходит за рамки репы — в бизнес-логику. не надо мешать одно с другим и пытаться что-то нагородить кривобокое.
А это тут причем?

hVosttпосему, пропихивать говнокодинг, МСУ, не надо. или приводи пример, подтверждающий свои слова, или иди лесом, пока все твои слова высер умственно отсталого, который ляпает сам не зная чего. примеры давай. ссылки, пруфы, шо там у тебя есть за пазухай. или не умничай.
Я уже всё объяснил, все поняли, о чем речь и как нужно писать репозитории. У одного тебя как всегда крыша перевернута на 180 градусов. Что тебе еще объяснить? Перечитай еще раз, что я писал.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38327036
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttПарамон, ничего идеального не бывает :)
Речь не об идеальности, просто в очередной раз форум учит тебя, бестолочь, уму разуму. Заметь, по любому вопросу тебя приходится шпынять как мячик. Иди букварь читай.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38327042
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosрепозитарий в твом примере один - dbcontext
Сахават, кончай бредить.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38327087
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

ты это по какому поводу?
робята, признайтесь честно, вы пишите реальные программы?
...
Рейтинг: 0 / 0
167 сообщений из 167, показаны все 7 страниц
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Грамотная архитектура приложения на ASP.NET MVC
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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