powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Тестовое задание
25 сообщений из 153, страница 4 из 7
Тестовое задание
    #39478857
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyа почему не Get(userId), а new AccountByUserSpecification не спрятать в Get?

Чтобы выполнялся принцип открыт-закрыт. Спецификаций может быть сколько угодно, и для этого не требуется трогать интерфейс репозитория.


AntonariyAccountByUserSpecification вообще какой-то мутный класс, чье название больше подходит для функции. нафига под каждый способ выборки (ByUserName, ByUserPenisSize) класс городить? GetBy1способ, GetBy2способ по-моему логичнее.

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

GetBy1, GetBy2 — особенность разработки новичков и нубов
...
Рейтинг: 0 / 0
Тестовое задание
    #39479200
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внес некоторые правки, добавил кэширование настроек
https://github.com/fiqwenbv/ParrotWings
...
Рейтинг: 0 / 0
Тестовое задание
    #39479271
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt Чтобы выполнялся принцип открыт-закрыт. Спецификаций может быть сколько угодно, и для этого не требуется трогать интерфейс репозитория.Соответственно AccountByUserSpecification тоже должен реализовывать какой-нибудь IAccount?

hVostt Таким образом, твой репозиторий остаётся открытым для расширения и закрытым для модификаций, что весьма благоприятным образом сказывается на устойчивости архитектуры.Не понял. "Мой репозиторий" это то, каким его представил я или каким он должен быть по твоим выкладкам, чтобы "благоприятным образом сказывался"?

hVostt GetBy1, GetBy2 — особенность разработки новичков и нубовНовичок и нуб это одно и то же :)
...
Рейтинг: 0 / 0
Тестовое задание
    #39479280
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyСоответственно AccountByUserSpecification тоже должен реализовывать какой-нибудь IAccount?

Не, он должен реализовывать что-то типа ISpecification<TEntity>. Где под TEntity подставляется Account, например.


AntonariyНе понял. "Мой репозиторий" это то, каким его представил я или каким он должен быть по твоим выкладкам, чтобы "благоприятным образом сказывался"?

Ну да, твой, ты предложил добавить GetBy1, GetBy2, это твоё видение, а не моё. По моим выкладкам я сказал, какому принципу это соответствует. С чем не согласен?


AntonariyНовичок и нуб это одно и то же :)

Неа. Новичёк это чувак с полным отсутствием опыта. Нуб это чувак, которого опыт ничему не учит и он продолжает оставаться на уровне новичка :)
...
Рейтинг: 0 / 0
Тестовое задание
    #39479306
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttAntonariyСоответственно AccountByUserSpecification тоже должен реализовывать какой-нибудь IAccount?

Не, он должен реализовывать что-то типа ISpecification<TEntity>. Где под TEntity подставляется Account, например.


AntonariyНе понял. "Мой репозиторий" это то, каким его представил я или каким он должен быть по твоим выкладкам, чтобы "благоприятным образом сказывался"?

Ну да, твой, ты предложил добавить GetBy1, GetBy2, это твоё видение, а не моё. По моим выкладкам я сказал, какому принципу это соответствует. С чем не согласен?


AntonariyНовичок и нуб это одно и то же :)

Неа. Новичёк это чувак с полным отсутствием опыта. Нуб это чувак, которого опыт ничему не учит и он продолжает оставаться на уровне новичка :)

to hVostt
Код: c#
1.
Expression<Func<T, bool>> predicate



а чем это не спецификация? тоже можно обернуть чем-то, и цепочки AND/OR строить
...
Рейтинг: 0 / 0
Тестовое задание
    #39479307
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskhVosttпропущено...


Не, он должен реализовывать что-то типа ISpecification<TEntity>. Где под TEntity подставляется Account, например.


пропущено...


Ну да, твой, ты предложил добавить GetBy1, GetBy2, это твоё видение, а не моё. По моим выкладкам я сказал, какому принципу это соответствует. С чем не согласен?


пропущено...


Неа. Новичёк это чувак с полным отсутствием опыта. Нуб это чувак, которого опыт ничему не учит и он продолжает оставаться на уровне новичка :)

to hVostt
Код: c#
1.
Expression<Func<T, bool>> predicate



а чем это не спецификация? тоже можно обернуть чем-то, и цепочки AND/OR строить

так сказать "из каробки"
...
Рейтинг: 0 / 0
Тестовое задание
    #39479330
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskа чем это не спецификация? тоже можно обернуть чем-то, и цепочки AND/OR строить

Спецификация может получить нужные ей зависимости, а твой Expression не может. Так что не сравнивай одно место с пальцем. Как простейший учебный вариант покатит, но не в бою.
...
Рейтинг: 0 / 0
Тестовое задание
    #39479332
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to hVostt

в дополнение к этому вопрос, с построением predicate для entity/list<entity> все понятно (на самом деле, мне не все понятно, там может подзапрос в "where" идти, типа "Id in ()"):

так что этот шаблон применим штучно, там, где он действительно нужен
...
Рейтинг: 0 / 0
Тестовое задание
    #39479333
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttest_taskа чем это не спецификация? тоже можно обернуть чем-то, и цепочки AND/OR строить

Спецификация может получить нужные ей зависимости , а твой Expression не может. Так что не сравнивай одно место с пальцем. Как простейший учебный вариант покатит, но не в бою.

можно пояснить на примере?
...
Рейтинг: 0 / 0
Тестовое задание
    #39479334
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task,

Ещё лучше это абстракция запрос-обработчик, куда укладываются спецификации (объект-запрос), и прямой путь к разделению на читателя/писателя :)
...
Рейтинг: 0 / 0
Тестовое задание
    #39479335
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttest_task,

Ещё лучше это абстракция запрос-обработчик, куда укладываются спецификации (объект-запрос), и прямой путь к разделению на читателя/писателя :)

не спорю, что есть случаи и их применения. тут это. пока, не надо
...
Рейтинг: 0 / 0
Тестовое задание
    #39479336
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttest_task,

Ещё лучше это абстракция запрос-обработчик, куда укладываются спецификации (объект-запрос), и прямой путь к разделению на читателя/писателя :)

а почему Вас так читатели/писатели интересуют? CQRS? читал об этом, но, не работал с этой архитектурой.
...
Рейтинг: 0 / 0
Тестовое задание
    #39479338
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНу да, твой, ты предложил добавить GetBy1, GetBy2, это твоё видение, а не моё. По моим выкладкам я сказал, какому принципу это соответствует. С чем не согласен?Я просто не понял, к какой из реализаций относится фраза "благоприятным образом".
...
Рейтинг: 0 / 0
Тестовое задание
    #39479342
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttс агрегатами доменной модели

можете тут прояснить? у меня с этим опыт только как настроить маппинг NH (там так можно), чтобы "документ и его табличные части все разом сохранились (у них есть тоже зависимые объекты)". про это?
...
Рейтинг: 0 / 0
Тестовое задание
    #39479346
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskа почему Вас так читатели/писатели интересуют? CQRS? читал об этом, но, не работал с этой архитектурой.

В данный момент мы активно используем DDD/CQRS/ES. Поэтому и интересует.
...
Рейтинг: 0 / 0
Тестовое задание
    #39479347
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЯ просто не понял, к какой из реализаций относится фраза "благоприятным образом".

Разумное следование принципам SOLID, мы говорили об одном из принципов.
...
Рейтинг: 0 / 0
Тестовое задание
    #39479348
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskможете тут прояснить? у меня с этим опыт только как настроить маппинг NH (там так можно), чтобы "документ и его табличные части все разом сохранились (у них есть тоже зависимые объекты)". про это?

С натягом да, про это. В EF/NH корни агрегации можно выделить лишь условно.
...
Рейтинг: 0 / 0
Тестовое задание
    #39480600
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttAntonariyСоответственно AccountByUserSpecification тоже должен реализовывать какой-нибудь IAccount?

Не, он должен реализовывать что-то типа ISpecification<TEntity>. Где под TEntity подставляется Account, например.
А можешь дать сылку или набросать кратенький пример, раскрывающий смысл этого ISpecification<TEntity>. Хочу переделать под этот паттерн такой код:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public interface IPQList<T>
    {
        AjaxJsonGetResult<Paging<T>> GetPQList(string Selector, int pq_curpage, int pq_rpp, string pq_sort, string pq_filter)
    }

 public AjaxJsonGetResult<Paging<UwsRoles>> GetPQList(string Selector, int pq_curpage, int pq_rpp, string pq_sort, string pq_filter)
        {
            pq_sort = DeSerializeHelper.DeSerializeSort(pq_sort);
            var pqf = DeSerializeHelper.DeSerialize<PQFilter>(pq_filter);
            return new AjaxJsonGetResult<Paging<UwsRoles>>(repo.GetList(HttpContext.GetObjName(), Selector, 
                repo.GetPassportID(HttpContext.GetStateID()), pq_curpage, pq_rpp, pqf, pq_sort));
        }



И еще вопрос, связанный с этим кодом. IPQList<T> зависит не от интерфейсов, а от классов AjaxJsonGetResult и Paging, а это, насколько я понимаю, моветон. Или нет? Если да, то проблема в Paging (на AjaxJsonGetResult можно забить, это временная затычка пока студию не починят ):

Код: 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.
public interface IPaging
    {
        int Page { get; }
        int Total { get; }
        bool HasPrevious { get; }
        bool HasNext { get; }
        string Action { get; set; } //маршрут возврата для селектора
        string ID { get; set; } //ID возврата для селектора
        string Entity { get; set; }
        string PrimaryKey { get; set; }
    }

    public class Paging<TEntity> : IPaging
    {
        public int Page { get; private set; }
        public int Total { get; private set; }
        public string Action { get; set; }
        public string ID { get; set; }
        public bool HasPrevious { get => (Page > 1); }
        public bool HasNext { get => (Page < Total); }
        public string Entity { get; set; }
        public string PrimaryKey { get; set; }

        public IReadOnlyList<TEntity> Records { get; set; }

        public Paging(IReadOnlyList<TEntity> rec, int pageNumber, int pageSize, int qty)
        {
            Page = pageNumber;
            Records = rec;
            if (Records == null) Records = new List<TEntity>();
            Total = qty;
            Action = "Index";
        }

    }

Однако сделать зависимость IPQList от IPaging<TEntity> вместо Paging<TEntity> невозможно, поскольку Paging, реализующий IPaging<TEntity> немедленно требует конкретный <Entity>. Paging<TEntity> прекрасно справляется со всеми entity, и городить отдельный Paging для каждого entity совсем не хочется.

Как быть в такой ситуации?
...
Рейтинг: 0 / 0
Тестовое задание
    #39480605
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА можешь дать сылку или набросать кратенький пример, раскрывающий смысл этого ISpecification<TEntity>.
https://en.wikipedia.org/wiki/Specification_pattern
...
Рейтинг: 0 / 0
Тестовое задание
    #39480625
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА можешь дать сылку или набросать кратенький пример, раскрывающий смысл этого ISpecification<TEntity>. Хочу переделать под этот паттерн такой код:

Конкретно особенностей реализации, их довольно много. Большинство из них базируются на Expression внутрях, но не все.

Вот зачётный примерчик http://enterprisecraftsmanship.com/2016/02/08/specification-pattern-c-implementation/


AntonariyИ еще вопрос, связанный с этим кодом. IPQList<T> зависит не от интерфейсов, а от классов AjaxJsonGetResult и Paging, а это, насколько я понимаю, моветон. Или нет? Если да, то проблема в Paging (на AjaxJsonGetResult можно забить, это временная затычка пока студию не починят ):

Ну вот у тебя пример по сути что-то типа Query Object, только неудачный, так как используется сериализация в строку, что выглядит как костыль для возможности работать с веб-приложением. Сериализация/десреиализация это вопрос, решающийся на стыке клиент-сервер, посмотри на ModelBinder к примеру. Не нужно это просовывать внутрь своих сервисов. Ужасно тяжко поддерживать, отлаживать и развивать.

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

Интерфейс IPaging опять же, у тебя решает несколько задач, и вообще по виду призван обслуживать прикладные запросы клиентского кода. Его в сервисах тоже не должно быть, на мой взгляд. Результат запроса по пейджингу: это срез + общее количество элементов. А IPageabe это больше относится к view model, так информация HasNext/HasPrevious и проч. нужна для презентации, в логике она не нужна.


AntonariyОднако сделать зависимость IPQList от IPaging<TEntity> вместо Paging<TEntity> невозможно, поскольку Paging, реализующий IPaging<TEntity> немедленно требует конкретный <Entity>. Paging<TEntity> прекрасно справляется со всеми entity, и городить отдельный Paging для каждого entity совсем не хочется.

Не, конечно не надо этого делать. Речь-то шла о спецификациях, а не о результатах запроса. Репозиторий может выглядеть так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public interface IRepository
{
   TEntity Find<TEntity>(int id);
   IReadOnlyCollection<TEntity> Get(ISpecification<TEntity> specification);
   IPagedReadOnlyCollection<TEntity> GetPaged(ISpecification<TEntity> specification, int page, int pageSize);
   void Add<TEntity>(TEntity entity);
   void Remove<TEntity>(TEntity entity);
}



Для пейджинга отдельный метод.

По моему же глубокому убеждение, методов, возвращающих коллекции репозиторий иметь не должен. Он должен уметь извлечь сущность из хранилища по ID, добавить и удалить. Всё.

Остальное уходит на роль IQuery / IQueryProcessor / IQueryHandler<IQuery> — это намного гибче и не надо ходить по скользкому краю, постоянно матерясь.
...
Рейтинг: 0 / 0
Тестовое задание
    #39480636
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttPaging может быть либо одним из комбинируемых спецификаций, либо базовой спецификацией.

на мой взгляд, Paging, не относится к спецификации
...
Рейтинг: 0 / 0
Тестовое задание
    #39480639
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskhVosttPaging может быть либо одним из комбинируемых спецификаций, либо базовой спецификацией.

на мой взгляд, Paging, не относится к спецификации

Я предложил ниже вариант, где не относится. Но если обобщить результат запроса, то можно и сделать спецификацией. Не вижу проблем.
...
Рейтинг: 0 / 0
Тестовое задание
    #39480640
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttОстальное уходит на роль IQuery / IQueryProcessor / IQueryHandler<IQuery> — это намного гибче и не надо ходить по скользкому краю, постоянно матерясь.

тут кроме гибкости добавляется еще б о льшая уверенность в том, что ОРМ сгенерит "нужный SQL" (спецификация тут может подводить). но этот шаблон фактически означает написание готовых параметризированных запросов под разные, возможно, схожие цели
...
Рейтинг: 0 / 0
Тестовое задание
    #39480641
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskhVosttОстальное уходит на роль IQuery / IQueryProcessor / IQueryHandler<IQuery> — это намного гибче и не надо ходить по скользкому краю, постоянно матерясь.

тут кроме гибкости добавляется еще б о льшая уверенность в том, что ОРМ сгенерит "нужный SQL" (спецификация тут может подводить). но этот шаблон фактически означает написание готовых параметризированных запросов под разные, возможно, схожие цели

в смысле, это его "минус"
...
Рейтинг: 0 / 0
Тестовое задание
    #39480643
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskтут кроме гибкости добавляется еще б о льшая уверенность в том, что ОРМ сгенерит "нужный SQL" (спецификация тут может подводить). но этот шаблон фактически означает написание готовых параметризированных запросов под разные, возможно, схожие цели

Спецификация не отвечает за генерацию нужного SQL, за это отвечает провайдер. В случае EF, это LINQ провайдер. Поэтому подводить она не может.
...
Рейтинг: 0 / 0
25 сообщений из 153, страница 4 из 7
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Тестовое задание
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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