Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Цикл статей по Entity Framework 
:(
    Опции темы
SLeN
Дата 15.6.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 1
Всего: 4



Цитата(Idsa @  15.6.2009,  06:35 Найти цитируемый пост)
PashaPash, ты не мог бы закидать меня ссылками по поводу того, как неPOCO негативно влияет на юнит-тестирование и архитектуру в целом? А то ничего толкового по этому поводу найти не удалось... а у самого опыта в этом деле минимум. 


Лучше публично.

И до сих пор ждем:

Цитата(PashaPash @  9.6.2009,  19:29 Найти цитируемый пост)
L2S вообще не требует ничего от сохраняемого класса. Берешь POCO объект - и сохраянешь/загружаешь (могу пример скинуть для изучения). Т.е. он позволяет сделать CRUD-репозиторий для произвольных классов.


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

--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
PashaPash
Дата 15.6.2009, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 8
Всего: 49



Цитата(Idsa @  15.6.2009,  06:35 Найти цитируемый пост)

PashaPash, ты не мог бы закидать меня ссылками по поводу того, как неPOCO негативно влияет на юнит-тестирование и архитектуру в целом? А то ничего толкового по этому поводу найти не удалось... а у самого опыта в этом деле минимум. 

На юнит-тестирование - очень простое влияние. неPOCO (точнее, отсутствие Persistence Ignorance) требует базы данных для прогонки каждого теста. При этом:
1. Состояние базы должно быть одинаковым для каждого запуска
2. Результат не должен зависеть порядка запуска

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

А в целом на архитектуру - очень размытое понятие. Напиши что-нибудь крупное на EF, узнаешь ;)

Добавлено через 1 минуту и 8 секунд
Цитата(SLeN @  15.6.2009,  16:23 Найти цитируемый пост)

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

Посмотри http://blog.wekeroad.com/subsonic/subsonic...mplerepository/


--------------------
PM MAIL WWW   Вверх
Idsa
Дата 16.6.2009, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(PashaPash @  15.6.2009,  20:41 Найти цитируемый пост)
На юнит-тестирование - очень простое влияние. неPOCO (точнее, отсутствие Persistence Ignorance) требует базы данных для прогонки каждого теста.

Хм... А разве EF-сущности требуют базу данных для прогонки тестов?  smile 


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
PashaPash
Дата 18.6.2009, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 8
Всего: 49



Цитата(Idsa @  16.6.2009,  07:37 Найти цитируемый пост)

Хм... А разве EF-сущности требуют базу данных для прогонки тестов?  smile  

Ок, простой пример.
Код

    public class Customer
    {
        public int Id { get; set; }
        public int Name { get; set; }
    }

    public interface ICustomerService
    {
        Customer CreateCustomer(string name);
    }

    public class CustomerService : ICustomerService
    {
        public Customer CreateCustomer(string name)
        { 
            
        }
    }

//....
    [TestMethod]
    public void CreateCustomer_Creates_Customer()
    {
        // Arrange
        ICustomerService service = new CustomerService();

        // Act
        Customer newCustomer = service.CreateCustomer("cust1");

        // Assert
        Assert.AreNotEqual(0, newCustomer);
        Assert.AreEqual("cust1", newCustomer.Name);
    }


Как должен выглядеть CustomerService.CreateCustomer в случае EF? Чтобы он работал во время тестов без базы, а в живой системе - с базой, и честно в нее сохранял без дополнительной пляски с бубном.


--------------------
PM MAIL WWW   Вверх
SLeN
Дата 18.6.2009, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 1
Всего: 4



Как на счет Mock ?
--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
Idsa
Дата 22.6.2009, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



PashaPash, так уж сложилось, что на данный момент я еще не овладел искусством Unit-тестирования... Видимо, именно поэтому даже после того, как ты привел пример, я не понимаю, в чем разница между POCO/неPOCO в данном случае.

PashaPash, ты как-то заводил разговор о реализации Repository под EF v. 1... Вот блог-пост на эту тему: http://blog.keithpatton.com/2008/05/29/Pol...+Framework.aspx


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
PashaPash
Дата 22.6.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 8
Всего: 49



Idsa, трудность как раз не в том, чтобы реализовать IRepostory, как по ссылке. Трудно реализовать точно такой же IRepository, но уже без EF - т.е. чтобы он корректно сохранял объекты-наследники EntityObject. Попробуй просто набросать код CreateCustomer в примере выше. С использованием репозитория по ссылке, но со второй половиной - работой того же кода без базы данных.

SLeN, Mock - это хорошо, но тоже не слишком тривиально в случае EF. Приведешь пример?


--------------------
PM MAIL WWW   Вверх
SLeN
Дата 22.6.2009, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 1
Всего: 4



Цитата(PashaPash @  22.6.2009,  11:29 Найти цитируемый пост)
Приведешь пример? 

Не, - я от Ef пока отказался в пользу Nhibernate.

p.s.

Меня интересует Object First (DDD) а Ef пока этого не позволяет + я влюбился в рефлекшн оптимизатор Nhibernate =)

Это сообщение отредактировал(а) SLeN - 22.6.2009, 11:45
--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
PashaPash
Дата 22.6.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 8
Всего: 49



SLeN, а почему не в пользу родного L2S?


--------------------
PM MAIL WWW   Вверх
SLeN
Дата 22.6.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 1
Всего: 4



На мой взгляд Nhibernate более зрелая ( большинство проблем с которыми можно столкнутся в реальных проектах - уже столкнулись и решили), за многие годы в нее влилось куча гениальных решений (как я уже говорил один только рефлекшн оптимизатор чего стоит), + у её поведение для меня понятно на интуитивном уровне (тоесть - еслибы я участвовал в разработке некой ORM то использовал бы очень похожие решения).

Я пока с ней только осваиваюсь, но еще не было случая когда бы она меня огорчила =)


--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
Idsa
Дата 22.6.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



SLeN, а что рефлекшн оптимизатор умеет?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
SLeN
Дата 22.6.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 1
Всего: 4



Он умеет инжектировать свой код в классы тем самым используя рефлексию только 1 раз при запуске, а после через инжектированый код добираться до приватных членов  - тем самым позволяя бизнес уровню поддерживать инкапсуляцию несмотря на использование ORM.
--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
PashaPash
Дата 23.6.2009, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 8
Всего: 49



SLeN, эта куча гениальных решений точно так же влилась в Linq2SQL + добавилась нормальная поддержка Linq.
Linq to SQL тоже использует кодогенерацию "один раз при запуске" и потом заливает данные прямо в приватные члены, без рефлекшена. Просто MS не выпячивал это как супер-рефлекш-оптимайзер. Поработай с L2S немного, он намного интуитивнее остальных ORM.

Все ORM одинаковы - это реализация одного и того же паттерна, отличаются только детали. Насчет зрелости NHibernate - прошел год (!!!) от релиза .net 2.0 до поддержки 2.0, nullable и generics со стороны NHibernate. Полноценной поддержки Linq, на том уровне, на котором она есть в L2S (выборка только использованных в коде полей, лямбды, вылизанная кодогенерация) придется ждать еще года полтора. А в L2S это все появилось уже полтора года назад. Много всяких "рефлекш оптимайзеров и инжектирований кода" в нем уже работает, проверено на куче реальных проектов. NHibernate обречен ползти в хвосте, по довольно очевидным, но независящим от него причинам.


--------------------
PM MAIL WWW   Вверх
SLeN
Дата 23.6.2009, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 1
Всего: 4



HQL
позволяет
Цитата

Retrieving only properties of an entity or entities,...


вылизанная кодо генерация тоже присутствует.

лямбд - да не встречалось, но я пока использую версию 1.20 и не смотрел чего в 2.0 запихнули ;)
но и в 1.20 достаточно много стратегий выборки - HQL, QBC, QBE

В общем хочется пока поиграть с этой игрушкой =) , тем более что она очень гибкая и поддерживает кучу стратегий, ну а после того как почувствую себя в ней достаточно уверенно - взглянуть на остальное, к томуже  будет уже с чем сравнивать 

Это сообщение отредактировал(а) SLeN - 23.6.2009, 10:22
--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
PashaPash
Дата 23.6.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 8
Всего: 49



Цитата(SLeN @  23.6.2009,  10:08 Найти цитируемый пост)
HQL
позволяет
Цитата

Retrieving only properties of an entity or entities,...

Голый SQL тоже позволяет выбирать только определенные свойства. Вся разница в уровне. HQL позволяет это делать в виде строго типизированного кода? что-то вроде
Код

var idAndAlias = context
    .Companies
    .Select(c => new { c.Id, c.CompanyAlias })
    .FirstOrDefault();

string alias = idAndAlias.CompanyAlias;

Цитата(SLeN @  23.6.2009,  10:08 Найти цитируемый пост)
лямбд - да не встречалось, но я пока использую версию 1.20 и не смотрел чего в 2.0 запихнули ;)
но и в 1.20 достаточно много стратегий выборки - HQL, QBC, QBE

А в Linq 2 SQL - одна - LINQ, и она рвет эти "много" с большим отрывом. За счет преобразования кода C# в SQL запросы.

Цитата(SLeN @  23.6.2009,  10:08 Найти цитируемый пост)
В общем хочется пока поиграть с этой игрушкой =) , тем более что она очень гибкая и поддерживает кучу стратегий, ну а после того как почувствую себя в ней достаточно уверенно - взглянуть на остальное, к томуже  будет уже с чем сравнивать 

Сначала нужно смотреть стандартные - встроенные в framework - вещи. А не порты с java, отстающие в развитии на 3 года.


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1701 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.