powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF, Repository, UnitOfWork
25 сообщений из 164, страница 1 из 7
EF, Repository, UnitOfWork
    #38107941
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В EF DbContext и DbSet<T>, вообще говоря, реализуют из коробки соответственно UnitOfWork и Repository. Во всяком случае, сложилось такое мнение.

Погуглил на этут тему, а там народ, следуя четко по букварям оборачивает их руками в свои классы, которые реализуют свои интерфейсы интерфейсы. Т. е. вводят что-то вроде:

IRepository<T>, IUnitOfWork
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public interface IRepository<T> : IDisposable
        where T : class
    {
        IQueryable<T> Entities();
        void Update(T entity);
        void Add(T entity);
        void Remove(T entity);
        bool Contains(T entity);
    }



Код: sql
1.
2.
3.
4.
5.
    public interface IUnitOfWork : IDisposable
    {
        IRepository<T> GetRepository<T>() where T : class;
        void SaveAllChanges();
    }




Реализуют что-то вроде такого:

EfRepository<T>, EfUnitOfWork
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    internal class EfRepository<T> : IRepository<T>
        where T: class
    {

        public EfRepository(DbsET<t> dbSet)
        {
            _dbSet = dbSet;
        }
        ...
    {



Код: sql
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.
    internal class EfUnitOfWork : IUnitOfWork
    {
        private DbContext _dbContext;

        public EfUnitOfWork(DbContext dbContext)
        {
            _dbContext = dbContext;
        }

        public IRepository<T> GetRepository<T>()
            where T : class
        {
            return new EfRepository<T>(_dbContext.DbSet<T>());
        }

        public void SaveAllChanges()
        {
            _dbContext.SaveChanges();
        }

        public void Dispose()
        {
            _dbContext.Dispose();
        }
    }




Используют как-то так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
            using (var uow = MyFakeUnitOfWorkFactory.Create())
            {
                var orderRepo = uow.GetRepository<Order>();

                var z = from o in orderRepo.Entities()
                        select o;

                ...

                uow.SaveAllChanges();
            }




Вопрос в следующем и относится исключительно к случаю, когда используется EF Designer .

Если поколупаться, для генерации Context'a используюься tt, которые можно менять как угодно, чтобы те выдавали уже готовые, какие надо классы обертки для контекста, дбсетов, чтобы оно само добавляло в наследование какие надо интерфейсы IUnitOfWork, IRepository и т. п.. Вопрос, почему так не делают через tt или я плохо искал или кто-то делает? Поделитесь впечатлениями/подходами.

Вопрос второй, предположим мы абстрагировались с помощью интерфейсов по самое не могу от "инфраструктурной черни по книжкам умных дядек", и в нашей DomainModel'и ссылаемся на инфраструктурный слой исключительно по интерфейсам, возникает вопрос, как быть с Disconnected сценарием, когда граф обьектов приходит извне и его надо сохранить. В общем случае без ObjectStateManager здесь не выкрутиться. В голову приходит использовать какие-нибудь self tracking entities с контекстом, который их понимает (т. е. шаблон генерящий entities, генерирует их как self tracked и шаблон генерирующий контекст, делает его понимающим self tracked сущности. т. е. предполагается менять tt которые создаются вместе с edmx для достижения такого результата).

Это все пока высосанное из пальца "...а что если вдруг?...". У кого какие соображения и т. п.. Интересно знать для понимания границ применимости и т. п..
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38107953
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord British,

если у вас EF или NH - выкиньте к чёрту репозиторий. Общение с базой данных слишком сложный процесс, чтобы от него можно было хоть как-то абстрагироваться.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38107959
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,

Я примерно это и хотел услышать, спасибо! Хотя предчувствую говносрач в этой темке :D.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108046
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EF по дефолту генерит репозиторий. Я устал объяснять, что написание репозитория над репозиторием - бренд сивой кобылы.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108073
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУEF по дефолту генерит репозиторий. Я устал объяснять, что написание репозитория над репозиторием - бренд сивой кобылы.
Чего только не сделаешь для беглого доступа пользователей...
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108102
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программисты даже поиском пользоваться не умеют. Выбирай , руками никто не оборачивает.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108111
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa, судя по посту, вы придерживаетесь подхода - обернуть в свое. Понятно, все таки tt используют. Хотелось бы услышать мнение, из коробки оно и так UnitOfWork и Repository. Какие преимущества дает введение своего интерфейса IUnitOfWork и IRepository, кроме того, что можно проще написать FakeRepository для тестирования? И сферического в вакууме - DomainModel будет чиста от инфраструктурного кода и можно будет в теории сменить легко orm (слабо верится). Как живется с этим розовым миром в случае Disconnected сценария и. Concurrency. Не получается ли в итоге, что интерфейс IUnitOfWork и IRepisitory полностью или почти полностью дублирует публичный интерфейс классов DbContext, DbSet<>…

Очень интересно узнать мнение.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108114
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa, вот, например, http://tdryan.blogspot.com/2011/03/another-entity-framework-4-repository_5988.html?m=1

человек вводит свои интерфейсы (типа абстрагировался по букварю) и следом вводит в них свойства вроде LazyLoading, ProxyEnabled и т. п.. И это независимость от инфраструктурного кода? А если усложнить сценарий использования? Масло масляное масло, нет?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108117
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108122
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord BritishSeVa, судя по посту, вы придерживаетесь подхода - обернуть в свое. Понятно, все таки tt используют. Хотелось бы услышать мнение, из коробки оно и так UnitOfWork и Repository. Какие преимущества дает введение своего интерфейса IUnitOfWork и IRepository, кроме того, что можно проще написать FakeRepository для тестирования? И сферического в вакууме - DomainModel будет чиста от инфраструктурного кода и можно будет в теории сменить легко orm (слабо верится). Как живется с этим розовым миром в случае Disconnected сценария и. Concurrency. Не получается ли в итоге, что интерфейс IUnitOfWork и IRepisitory полностью или почти полностью дублирует публичный интерфейс классов DbContext, DbSet<>…

Очень интересно узнать мнение.


Естественно, что репозитории для говнокода не нужны и об этом на неустанно напоминает MCУ.
А в нормальной архитектуре должны соблюдаться принципы SOLID. Абстрактный интерфейс им отвечает, а все остальное нет.
Имея его на руках можно не зависеть от доступа к БД и двигаться дальше. DAL - это копейки и в нормальном фреймворке его можно сменить.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108123
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord Britishпардон, сцылко не то, вот правильное http://geekswithblogs.net/danemorgridge/archive/2010/06/28/entity-framework-repository-amp-unit-of-work-t4-template-on.aspx

Это статья ни о чем, вернее, для MCушек, которые не осилили DI и привыкли брать толстой задницей
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108176
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa,

Есть на примете по-вашему мнению правильные статьи применительно к EF? Поделитесь.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108195
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord British, вот тут копья ломали, Сева и им пододобные так и не осилили спич.
Тема развивается не сначала, а отсюда: 13687982 Почитай, мож что предложишь своё.
Тут реальный пример: http://codearticles.ru/Home/ArticleView/2155
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108199
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord BritishИ сферического в вакууме - DomainModel будет чиста от инфраструктурного кода и можно будет в теории сменить легко orm (слабо верится).
Меня это тоже смущает, после всех чисток остается фактически одна структура - Anemic Domain Model и свалка DTO рядом.
А смены orm на практике, так и не происходит.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108209
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaLord Britishпардон, сцылко не то, вот правильное http://geekswithblogs.net/danemorgridge/archive/2010/06/28/entity-framework-repository-amp-unit-of-work-t4-template-on.aspx

Это статья ни о чем, вернее, для MCушек, которые не осилили DI и привыкли брать толстой задницей

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

Предположим у вас есть интерфейс репозитория как у автора статьи, разве можно с ним решить задачу в disconnected сценарии? Добавим сюда Concurrency, для навару. Ведь чтобы сохранить граф в этом случае, прийдется спуститься до кишок objectstatemanager, или пилить self tracked entity и реализацию контекста под них. Хотя последнее можно обернуть в юнитофворк/репозитори. Может вы сможете предложить достаточно полные интерфейсы, позволяющие это сделать?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108218
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ, спасибо гляну. Но врядли что-то предложу, так как порват боян и в узел завязанныи, да и я не фаулер. А может оно и клучшему? :)

Парамон, угу.

Пишу с трубы так что стоит за отпечатки.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108228
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонLord BritishИ сферического в вакууме - DomainModel будет чиста от инфраструктурного кода и можно будет в теории сменить легко orm (слабо верится).
Меня это тоже смущает, после всех чисток остается фактически одна структура - Anemic Domain Model и свалка DTO рядом.
А смены orm на практике, так и не происходит.
А не только сменой ORM под знамя маршируем, есть еще 70% задач, в которых в бизнес слое нужно оперировать комплексными сущностями, напр: ProductInfo (ProductId, ProductName, CategoryName) которые получаются из чистых дата классов (Product, Category). Без DTO никак.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108230
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посему я и предлагаю чистый MVP подход - IDataService. В реализации своих сервисов может быть что угодно, никаких дополнительных EF репозиториев - сам контекст априори репозиторий. Вообщем, берем попкорн и читаем срач.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108247
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ ProductInfo (ProductId, ProductName, CategoryName) которые получаются из чистых дата классов (Product, Category). Без DTO никак.

Вот только как через него сложные пропертя и методы протягивать? Если в сервис слой, то мдель совсем стирильная остается.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108252
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонМСУ ProductInfo (ProductId, ProductName, CategoryName) которые получаются из чистых дата классов (Product, Category). Без DTO никак.
Вот только как через него сложные пропертя и методы протягивать? Если в сервис слой, то мдель совсем стирильная остается.
В DTO "сложным пропертям" и методам делать нечего.

есть дата класс

есть DTO (обвязка одного или нескольких дата классов)

есть модель (бизнес-логика, которая оперирует DTO классами)
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108255
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord BritishSeVaпропущено...


Это статья ни о чем, вернее, для MCушек, которые не осилили DI и привыкли брать толстой задницей

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

Предположим у вас есть интерфейс репозитория как у автора статьи, разве можно с ним решить задачу в disconnected сценарии? Добавим сюда Concurrency, для навару. Ведь чтобы сохранить граф в этом случае, прийдется спуститься до кишок objectstatemanager, или пилить self tracked entity и реализацию контекста под них. Хотя последнее можно обернуть в юнитофворк/репозитори. Может вы сможете предложить достаточно полные интерфейсы, позволяющие это сделать?

Вопросы правильные, тк один DAl - это мизер в 5%.
Для разработки клиентских приложений без геморроя нужно еще по крайней мере:
- валидация
- реализация интерфейсов ошибок и изменений
- поддержка полного графа объектов
- undo\redo
- ленивая загрузка
- переносимость
- возможность переключения с 2х звенки на 3х
- etc

Реализация все этого - весьма нетривиальная задача, но если это не реализовано, то клиентская часть превращается в говнокод(убожество в виде asp.net - отдельная история непригодная для бизнес-приложений, которую я даже не рассматриваю).
Все это есть в csla(dal может быть любой + можно полностью абстрагироваться с помощью ObjectFactory).
Если бы я сейчас делал все с нуля, то я бы внимательно рассмотрел на web api c OData, в которых есть приятные моменты, которых раньше не было.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108257
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУПосему я и предлагаю чистый MVP подход - IDataService. В реализации своих сервисов может быть что угодно, никаких дополнительных EF репозиториев - сам контекст априори репозиторий. Вообщем, берем попкорн и читаем срач.

Херня на постном масле, которая пригодна только для говносборников и отстойных рецептов.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108260
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaМСУПосему я и предлагаю чистый MVP подход - IDataService. В реализации своих сервисов может быть что угодно, никаких дополнительных EF репозиториев - сам контекст априори репозиторий. Вообщем, берем попкорн и читаем срач.

Херня на постном масле, которая пригодна только для говносборников и отстойных рецептов.
Иди это Фаулеру расскажи.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108266
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

а что такое ДТО?

есть концепт - Накладная, состоит из Шапки и Спецификация
кто тут кто? (класс, ДТО)
что читает ОРМ - Накладную? или по отдельности Ш и С?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108267
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosМСУ, а что такое ДТО?
http://msdn.microsoft.com/en-us/library/ff649585.aspx

ViPRosесть концепт - Накладная, состоит из Шапки и Спецификация
кто тут кто? (класс, ДТО)
что читает ОРМ - Накладную? или по отдельности Ш и С?
Что не ясно отсюда? 13762103
...
Рейтинг: 0 / 0
25 сообщений из 164, страница 1 из 7
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF, Repository, UnitOfWork
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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