powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Архитектура приложения, надо ли дублировать сущности под каждый слой
25 сообщений из 295, страница 2 из 12
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085829
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmaw,

Как раз описанный Вами вариант репозитория инкапсилирует логику доступа к БД (я потому и задал уточняющий вопрос, т.к. не понял, как DTO вписывается в репозиторий), все join-ы(или include-ы) делаются в датасервисе.

С EF действительно все описание репозитория укладывается в ~60 строчек, но попробуйте написать репозиторий хотя бы для ADO.NET
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085831
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttможно легко подменить способ хранения данных

для такого репо это сделать не получится легко
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085833
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttтакой репозиторий можно замокать для тестов

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

джоины и decode-логику куда пихать?
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085835
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttразные части ПО могут требовать сотни разных не связанных DTO

это сильно абстрактно. если что-то эдакое потребуется, может вообще потребоваться много чего переписать
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085836
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blestвсе join-ы(или include-ы) делаются в датасервисе

я не испытываю прям органической неприязни к такому варианту, но тут, на мой взгляд, теряется сама надобность репозитория. тогда сам ОРМ можно считать репозиторием.
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085837
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все-равно, как не крути, есть "доменная логика". и в сервис её нормально не впихнешь.
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085839
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blestвсе join-ы(или include-ы) делаются в датасервисе

т.е. вариант с реализацией на нативном SQL отпадает
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085843
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blestС EF ... для ADO.NET

в ADO.NET нет Entity. там есть только SQL и DTO. и там, наверное много логики в БД. но если надо феншуй - то легко: репо работают с DTO
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085845
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawblestС EF ... для ADO.NET

в ADO.NET нет Entity. там есть только SQL и DTO. и там, наверное много логики в БД. но если надо феншуй - то легко: репо работают с DTO

а захочется NHibernate - тоже без проблем, из датасервиса не надо будет выпиливать всякие останки от контекста, которые туда вместе с "все join-ы(или include-ы) делаются в датасервисе".
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085847
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawkmawпропущено...


в ADO.NET нет Entity. там есть только SQL и DTO. и там, наверное много логики в БД. но если надо феншуй - то легко: репо работают с DTO

а захочется NHibernate - тоже без проблем, из датасервиса не надо будет выпиливать всякие останки от контекста, которые туда вместе с "все join-ы(или include-ы) делаются в датасервисе".

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

серебряной пули не существует. но можешь поверить мне на слово, я подобный репо переводил с NHibernate на EF, и благодаря тому, что все обращения к БД делались исключительно через репо, а не через ISession, я это сделал за 1 день, при количестве Entity 100+

kmawмой вариант тоже без проблем мокается

не правда, ты в репо инкапсулируешь кроме работу с Entity ещё и работу с DTO, так что не получится замокать только хранилище (например, подменить EF или NH на коллекции в памяти), не трогая ни один байт кода, работающий с DTO.

kmawджоины и decode-логику куда пихать?

в дата-сервисы. а если точнее, в механику проекций. ты как DTO из Entity получаешь? я исключительно 100% проекциями, и никак иначе.

kmawэто сильно абстрактно. если что-то эдакое потребуется, может вообще потребоваться много чего переписать

достаточно того, что это абстрактно, а что касается «эдакого» — это можно о чём угодно сказать.

kmawвсе-равно, как не крути, есть "доменная логика". и в сервис её нормально не впихнешь.

ты говоришь о анемичной модели (дата-сервисы, DTO), и о доменной логике в таком случае говорить не приходится. логику ты можешь пихнуть хоть в сервисы, хоть уровнем выше, но суть в том, что ты работаешь с кортежами данных. никакой доменной моделью тут даже и не пахнет (если брать картинки, которые в начале топике опубликованы).
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085863
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blestно попробуйте написать репозиторий хотя бы для ADO.NETА что в этом сложного?
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085864
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAblestно попробуйте написать репозиторий хотя бы для ADO.NETА что в этом сложного?

надо будет состряпать ORM. чтобы сильно не возится, можно дёрнуть исходники EF или NH
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085866
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DTO, Entity... Да у вас, парни, EF головного мозга :)

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

Вот и подумайте, где у вас DTO, а где Entity :)
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085867
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttне правда, ты в репо инкапсулируешь кроме работу с Entity ещё и работу с DTO, так что не получится замокать только хранилище (например, подменить EF или NH на коллекции в памяти), не трогая ни один байт кода, работающий с DTO

Код: 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.
[TestMethod]
        public void Save_WhenMoreMaxLengthNameAndShortName_ThrowDataServiceException()
        {
            int factLength = 71;
            int maxLength = 70;
            InfoSystemDTO s = new InfoSystemDTO()
            {
                Name = new String('9', factLength),
                ShortName = new String('9', factLength)
            };

            try
            {
                service.Save(userId, s);
            }
            catch (DataServiceException ex)
            {
                Assert.AreEqual<int>(2, ex.Messages.Count, "Должно быть 2 сообщения об ошибке - по одному для каждого поля");
                

                Assert.AreEqual<bool>(true, ex.Messages.ContainsKey("Name"), "Должно быть сообщение об ошибке поля Name");
                Assert.AreEqual<bool>(true, ex.Messages.ContainsKey("ShortName"), "Должно быть сообщение об ошибке поля ShortName");

                Assert.AreEqual<string>(String.Format(MessageConst.LengthMaxConstraintMsg, factLength, maxLength), ex.Messages["Name"][0],
                    String.Format("Сообщение об ошибке для поля Name должно быть \"{0}\"", MessageConst.EmptyConstraintMsg));
                Assert.AreEqual<string>(String.Format(MessageConst.LengthMaxConstraintMsg, factLength, maxLength), ex.Messages["ShortName"][0],
                    String.Format("Сообщение об ошибке для поля ShortName должно быть \"{0}\"", MessageConst.EmptyConstraintMsg));
                return;
            }

            Assert.Fail("Метод не бросил DataServiceException");

        }
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085869
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAпропущено...
А что в этом сложного?

надо будет состряпать ORM. чтобы сильно не возится, можно дёрнуть исходники EF или NH Чтобы сильно не возиться можно тупо IDataRecord в то, что тебе нужно отобразить. Для репозитория с тремя методами Add, Get и GetAll этого будет достаточно.
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085870
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
public InfoSystemServiceUnitTest()
        {
            IInfoSystemAccessService infoSystemAccessService = new InfoSystemAccessService(
                Mock.Of<IUserRepository>(d => d.GetById(userId) == new UserDTO() { }), 
                Mock.Of<IInfoSystemAccessSpecification>(d => d.GetListInfoSystemIdForDirectManager(userId) == new List<long>()  &&
                                                        d.GetListInfoSystemIdForProjectManager(userId) == new List<long>()      &&
                                                        d.GetListInfoSystemTypeIdForDirectManager(userId) == new List<long>()   &&
                                                        d.GetListInfoSystemTypeIdForProjectManager(userId) == new List<long>()));

            
            service = new InfoSystemService(
                    null,
                    Mock.Of<IInfoSystemRepository>(d => d.Save(userId, new InfoSystemDTO() { }) == new InfoSystemDTO() { }),
                    Mock.Of<IInfoSystemTypeRepository>(d => d.GetList(userId, null) == new List<InfoSystemTypeDTO>() 
                    { 
                       new  InfoSystemTypeDTO()
                       {
                         Id = 100000,
                         Name = "Тип1"
                       },
                       new  InfoSystemTypeDTO()
                       {
                         Id = 100001,
                         Name = "Тип2"
                       }
                    }),
                    null,
                    infoSystemAccessService);

        }
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085877
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVosttпропущено...


надо будет состряпать ORM. чтобы сильно не возится, можно дёрнуть исходники EF или NH Чтобы сильно не возиться можно тупо IDataRecord в то, что тебе нужно отобразить. Для репозитория с тремя методами Add, Get и GetAll этого будет достаточно.

Да, IDataReader будет достаточно, просто это уже не 60 строчек кода будет.
Я к тому, что репозиторий на то и нужен, чтобы именно эту реализацию доступа к БД в себе и заключать и ничего лишнего имхо.
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085879
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAможно тупо IDataRecord в то, что тебе нужно отобразить

в DTO
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085880
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmaw
Код: c#
1.
service.Save(userId, s);



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


kmaw
Код: c#
1.
Mock.Of<IUserRepository>(d => d.GetById(userId) == new UserDTO() { })



Эмм... как я и говорил, ты не можешь замокать хранилище, ты мокаешь фабрику DTO, и это вообще не имеет никакого отношения к хранилищу. Вообще.

С нормальным репо, я могу сделать один мок на всё хранилище, а дальше уже тестировать сервисы, тестировать проекции и прочее.
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085884
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAЧтобы сильно не возиться можно тупо IDataRecord в то, что тебе нужно отобразить. Для репозитория с тремя методами Add, Get и GetAll этого будет достаточно.

Тогды прощай навигации )) ну да, в принципе можно, и это будет не много кода.
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085886
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANADTO, Entity... Да у вас, парни, EF головного мозга :)

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

Вот и подумайте, где у вас DTO, а где Entity :)

Я об этом и говорю. Репо это по факту «ДАЙ-ПОЛОЖИ». Откуда он чего берёт и куда кладёт, нам фиолетово. Часть сущностей может лежать в SQL, часть в монго, часть вообще через веб-сервисы. И нам всё равно это всё фиолетово.

Просто под DTO понимаются кортежи данных, нужных бизнесу. Типа мне надо на форму вывести 10 полей, или в грид собрать кортежи по 10 полей, нафига мне не упало всё остальное, для этого используются DTO.
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085887
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawskyANAможно тупо IDataRecord в то, что тебе нужно отобразить

в DTOЕсли Вам надо в DTO, отображайте в DTO :)
...
Рейтинг: 0 / 0
Архитектура приложения, надо ли дублировать сущности под каждый слой
    #39085888
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttи это вообще не имеет никакого отношения к хранилищу. Вообще

естественно не имеет. и не должно. это тест бизнес-логики
...
Рейтинг: 0 / 0
25 сообщений из 295, страница 2 из 12
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Архитектура приложения, надо ли дублировать сущности под каждый слой
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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