powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF, Repository, UnitOfWork
164 сообщений из 164, показаны все 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
EF, Repository, UnitOfWork
    #38108271
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ есть дата класс

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

есть модель (бизнес-логика, которая оперирует DTO классами)


Потом в модели завернули новый DTO и отправили дальше. Длинный конвеер получается.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108272
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

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

ах вот оно что, это какой то фаулер Датасет назвал ДТО
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108279
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Seva,

- реализация интерфейсов ошибок и изменений - INotifyPropertyChanged, INotifyCollectionChanged, IErrorDataInfo?
- поддержка полного графа объектов - что имеется ввиду?
- undo\redo - IEditableObject?
- ленивая загрузка - lazy/eager loading?

- переносимость - что имеется ввиду? если это переносимость между СУБД, то могу подкинуть предметную область, где все запросы будут не на стандартном SQL и схема данных будет различной в разных СУБД. Обработка геоданных/картография/анализ дорожных сетей. Можно пилить свою реализацию на табличках и колонках, вряд ли будет эффективно, а можно пользоваться средствами специфичными для СУБД и с частью логики на PL/SQL (увы большей частью), а частью снаружи. Есть компании, которые решают это выпуская свои специальные продукты, через которые работают все вышележащее (например, ESRI ArcSDE такой продукт шлюз, под каждую СУБД своя схема, своя реализация логики, публичный API общий - слушает порт, протокол одинаковый). Не каждая контора потянет денежкой содержать столько зверей под каждую СУБД (MS SQL, Oracle, DBII, PostgreeSQL). Это я к тому, что переносимости может и не получиться по выше описанным причинам.

- возможность переключения с 2х звенки на 3х - можно подробнее?
- etc

---

Кстати говоря, ползуясь случаем, хочу спросить кто колупал LightSwitch, как ощущения? Там вроде есть все перечисленное выше для некоторого круга задач, типа документооборотов и т. п...

---
Давайте все же вернемся к EF, UOW, REPO и потроллим друг-друга на тему надо/не надо.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108280
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонМСУ есть дата класс

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

есть модель (бизнес-логика, которая оперирует DTO классами)


Потом в модели завернули новый DTO и отправили дальше. Длинный конвеер получается.
да конвеер то фиг с ним, это мы умеем, линии конвееры танки...
а что делать с таким классом, ну получил кто то такой класс, а там ни свойств ни методов
ужсть какой то
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108289
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонПотом в модели завернули новый DTO и отправили дальше. Длинный конвеер получается.
А дальше - точно так же, как и обычно. То есть DTO - это плюс 1 абстракция, с помощью которой мы:
а) не прибиваем прикладной слой логики к конкретному ORM
б) абстрагируемся от дата-классов (маппинг объектов хранилища), пример с ProductInfo (ProductId, ProductName, CategoryName)

Второе намного важнее, чем фееричная смена ORM. Просто если мы реализуем пункт б), мы автоматом получаем в бонус пункт а)
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108291
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord BritishКстати говоря, ползуясь случаем, хочу спросить кто колупал LightSwitch, как ощущения? Там вроде есть все перечисленное выше для некоторого круга задач, типа документооборотов и т. п...
Я колупал, жалкое сильверлайтовское отребье. Тут недавно было.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108292
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord BritishДавайте все же вернемся к EF, UOW, REPO и потроллим друг-друга на тему надо/не надо.

Это не тема, а мелкие частности, которые в любой момент могут быть заменены. Если это есть, то это решение. А сам по себе EF пригоден только в качестве тупого DAL, любые попытки слепить из него что-то более внятное(ты упоминал: lazy, proxy) ничего не дадут кроме еще большего усложнения и так мало пригодной половы
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108294
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

правильно я понимаю, что ДТО в моем примере это - Накладаная целиком?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108295
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или это что бог на душу положит?
типа какой нить джойн?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108296
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даю 5 мин на ответ, потом расстрел на месте
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108298
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosМСУ, правильно я понимаю, что ДТО в моем примере это - Накладаная целиком?
Да.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108314
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosили это что бог на душу положит?
типа какой нить джойн?
Это то, что требуется твоей бизнес-логике.

EF классы (ORM)
Код: 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.
public class NoteType
{
    public int NoteTypeId { get; set; }
    public string Title { get; set; }
}

public class Supplier
{
    public int SupplierId { get; set; }
    public string Title { get; set; }
}

public class NoteDetail
{
    public int NoteDetailId { get; set; }
    public decimal Cost { get; set; }
            
}

public class Note
{
    public int NoteId { get; set; }
    public Supplier Supplier { get; set; }
    public NoteType Type { get; set; }
    public ICollection<NoteDetail> Details { get; set; }
}



DTO (то, что нужно модели)
Код: c#
1.
2.
3.
4.
5.
public class NoteDto
{
    public string SupplierTitle { get; set; }
    public decimal Total { get; set; }
}



IDataService:

Код: c#
1.
2.
3.
4.
5.
6.
7.
public NoteDto GetNote(int id)
{
    // Обращение к БД через EF и извлечение Note
    Note note = ...;
    var dto = new NoteDto { SupplierTitle = note.Supplier.Title, Total = note.Details.Sum(d => d.Cost) };
    return dto;
}
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108315
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУА дальше - точно так же, как и обычно. То есть DTO - это плюс 1 абстракция, с помощью которой мы:
а) не прибиваем прикладной слой логики к конкретному ORM
б) абстрагируемся от дата-классов (маппинг объектов хранилища), пример с ProductInfo (ProductId, ProductName, CategoryName)

Второе намного важнее, чем фееричная смена ORM. Просто если мы реализуем пункт б), мы автоматом получаем в бонус пункт а)

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

Pros and Cons of Data Transfer Objects

Как на пример туева хуча дата шейпов, чуть ли не на каждый запрос.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108319
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонМСУА дальше - точно так же, как и обычно. То есть DTO - это плюс 1 абстракция, с помощью которой мы:
а) не прибиваем прикладной слой логики к конкретному ORM
б) абстрагируемся от дата-классов (маппинг объектов хранилища), пример с ProductInfo (ProductId, ProductName, CategoryName)

Второе намного важнее, чем фееричная смена ORM. Просто если мы реализуем пункт б), мы автоматом получаем в бонус пункт а)

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

Pros and Cons of Data Transfer Objects

Как на пример туева хуча дата шейпов, чуть ли не на каждый запрос.
Что за дата шейпы?

Резюме в статье:

...As an architect, however, you should always be on the alert to recognize signs indicating that the distance between the entity model and what the presentation expects is significant or impossible to cover. In this case, you should take the safer (and cleaner) route of DTOs.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108324
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонМСУА дальше - точно так же, как и обычно. То есть DTO - это плюс 1 абстракция, с помощью которой мы:
а) не прибиваем прикладной слой логики к конкретному ORM
б) абстрагируемся от дата-классов (маппинг объектов хранилища), пример с ProductInfo (ProductId, ProductName, CategoryName)

Второе намного важнее, чем фееричная смена ORM. Просто если мы реализуем пункт б), мы автоматом получаем в бонус пункт а)

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

Pros and Cons of Data Transfer Objects

Как на пример туева хуча дата шейпов, чуть ли не на каждый запрос.

Поэтому я и писал про OData, который позволяет обойти эти проблемы
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108325
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУЧто за дата шейпы?

data shape
DTO другими словами.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108327
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ
Резюме в статье:

...As an architect, however, you should always be on the alert to recognize signs indicating that the distance between the entity model and what the presentation expects is significant or impossible to cover. In this case, you should take the safer (and cleaner) route of


На самом деле я и не вижу альтернатив, а хотелось бы.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108328
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaПоэтому я и писал про OData, который позволяет обойти эти проблемы
Покурю на досуге, пока не ясно )
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108331
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонSeVaПоэтому я и писал про OData, который позволяет обойти эти проблемы
Покурю на досуге, пока не ясно )


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

это плохо
такихДТО могут быть тыщами
что то тут концептуально не проработано
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108336
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонSeVaПоэтому я и писал про OData, который позволяет обойти эти проблемы
Покурю на досуге, пока не ясно )
Не кури, опять бредни Севы. OData в обсуждаемой теме никак не относится :)

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

это плохо
такихДТО могут быть тыщами
что то тут концептуально не проработано
Значит, тыщами. Классифицируй по предназначению.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108341
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

это просто запросы к БД?
а зачем тогда объектная модель и маппинг?
определение ДТО как я понимаю на сервереной части?
или это просто метод какого то объекта
не врубаюсь
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108342
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDataService определен на сервере?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108343
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а на клиенте просто запрашиваешь сервис безотностительно к объектной модели?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108347
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosне врубаюсь
Пиши на датасетах и не ипи мне моск :)
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108359
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

не разговор не о датасетах и еще че то
ОРМ означет для меня что
1. Есть Объектная модель ОМ (т.е. вся работа по проблемной области сконцентрирована тут)
2. Есть Хранилище Х( в данном случае РСУБД)
3. Есть Прозрачный маппинг элементов ОМ в элементы Х

никаких других конструкцтий тут не должно быть
а с твоих слов выходит что в ЕФ ОМ сам по себе а работа идет с вспомогательными конструкциями какими то
концепция нарушена
ладно бы метод объекта автоматом маппировалась в ИДатаСервис (прозрачно), нет как я понял эти сервисы надо вручную создавать, а методы их вызывающие воще не относятся к ОМ
прально?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108371
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУПарамонпропущено...

Покурю на досуге, пока не ясно )
Не кури, опять бредни Севы. OData в обсуждаемой теме никак не относится :)

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

Муся, ты чмошник, который должен только молча копать и отрабатывать свою пайку, а не рассуждать о том, что правильно.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108375
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosМСУ,

не разговор не о датасетах и еще че то
ОРМ означет для меня что
1. Есть Объектная модель ОМ (т.е. вся работа по проблемной области сконцентрирована тут)
2. Есть Хранилище Х( в данном случае РСУБД)
3. Есть Прозрачный маппинг элементов ОМ в элементы Х

никаких других конструкцтий тут не должно быть
а с твоих слов выходит что в ЕФ ОМ сам по себе а работа идет с вспомогательными конструкциями какими то
концепция нарушена
ладно бы метод объекта автоматом маппировалась в ИДатаСервис (прозрачно), нет как я понял эти сервисы надо вручную создавать, а методы их вызывающие воще не относятся к ОМ
прально?


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

Не кури, опять бредни Севы. OData в обсуждаемой теме никак не относится :)

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

Сдурел, что-ли? Ты бы еще рефлексию предложил в прикладном коде.

Муся, ты чмошник, который должен только молча копать и отрабатывать свою пайку, а не рассуждать о том, что правильно.

Сева, ты опущенец, которого все кому не лень опускают на форуме. Так было, так есть, так будет. Свыкнись со своей кармой, неуч.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108385
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaМСУпропущено...

Не кури, опять бредни Севы. OData в обсуждаемой теме никак не относится :)

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

Сдурел, что-ли? Ты бы еще рефлексию предложил в прикладном коде.

Муся, ты чмошник, который должен только молча копать и отрабатывать свою пайку, а не рассуждать о том, что правильно.


Попробуй с помощью с своего говнодата сервиса и прочего бреда изобразить то, что достаточно легко делается с OData.
Один контрол и несколько незамысловатых классов и больше нет проблемы с кучей DTO. OData Viewer Tool

Только тужься у себя в туалете, а не как обычно, на форуме
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108387
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУSeVaпропущено...


Муся, ты чмошник, который должен только молча копать и отрабатывать свою пайку, а не рассуждать о том, что правильно.

Сева, ты опущенец, которого все кому не лень опускают на форуме. Так было, так есть, так будет. Свыкнись со своей кармой, неуч.

Научись сначала угу-угу внятно бормотать, а когда подрастешь, может, и будут твое вяканье слушать.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108391
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaМСУпропущено...


Сева, ты опущенец, которого все кому не лень опускают на форуме. Так было, так есть, так будет. Свыкнись со своей кармой, неуч.

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

Кухарка предлагает использовать динамику в прикладном коде? Давно ли кухарка наведывалась к доктору?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108416
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa,

ну сама модель ОДата такая ж фигня как и ЕФ и т.д.
кроме Сущноси и Связи нет ничего
при это Сущность понимается как таблица в БД
нет понятия Схемы (именованный набор Связанных сущностей)

вот говрим Накладная и подазумрваем как минимум 2 Сущности - Шапка и Строки и связь между ними(в Випросе это макротип)
но в отдельности эти сущности нафиг никому не нужны кроме Мсушнего Идатасервис
Связь между Ш и С сильная
но тут же есть и слабыее связи - материал, ЕДИМ и т.д.
при задании схемы (макротипа) надо в мета указать сильные и слабые связи, направление зависимости и т.д.
а так из БД гоняете в БД
фигня все это
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108421
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord BritishДавайте все же вернемся к EF, UOW, REPO и потроллим друг-друга на тему надо/не надо.
К сожалению, в тему заглянули только штатные тролли, поэтому развести дискуссию по существу будет напряжённо. :)

Могу лишь изложить поподробнее своё мнение. Сам прошёл путь Stored Procedure -> NHibernate -> Repository over Nhibernate -> NHibernate -> NoSQL (в процессе).

В общем, в процессе работы по принципу Repository over Nhibernate пришёл к пониманию, что мне просто не хватает возможностей, которые есть в NH, и я потихоньку привожу Repository к ISesson. В итоге просто выкинул ненужным мне слой. И чуть позже наткнулся на хорошие блоги по этой теме: раз , два , и (особенно для любителей SOLID'а) три . Сам я тоже любитель SOLID. Но кроме него, надо держать в голове и свой разум. Ибо видел совершенно "солидный", но абсолютно неподдерживаемый код.

И вдогонку. Вся эта суета вокруг слоёв вообще, и репозитория в частности задумывалась ради одной цели - сделать код более поддерживаемым за счёт повышения его понятности. И еще повторного использования кода. На самом деле, обычно гораздо проще для поддерживаемсяости использовать не горизонтальное деление - слои, а вертикальное - разделы. При этом используя как можно меньше псевдоабстракций. С повторным использованием, всё еще проще - 90% кода повторно не используется. На практике это выглядит так: прямо в коде MVC-контроллера берём сессию, строим запрос, бросаме результат во ViewModel. Просто, понятно, быстро, тестируемо. Profit.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108434
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorНа практике это выглядит так: прямо в коде MVC-контроллера берём сессию, строим запрос, бросаме результат во ViewModel. Просто, понятно, быстро, тестируемо. Profit.
То есть весь BL в контроллере?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108444
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorВ общем, в процессе работы по принципу Repository over Nhibernate пришёл к пониманию, что мне просто не хватает возможностей, которые есть в NH, и я потихоньку привожу Repository к ISesson.
Не путай божий дар с яичницей. В NH ты в любом случае будешь строить свой репо, т.к. его нет. А EF уже и сразу автогенерит тебе его, бери и используй. Но находятся идиоты типа севы, которые этои репо еще разок обвязывают в свой репо.

SolYUtorпрямо в коде MVC-контроллера берём сессию, строим запрос, бросаме результат во ViewModel. Просто, понятно, быстро, тестируемо. Profit.
Жесть, причем убийственная...
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108448
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонЭто из плюсов, а минусов тоже не мало.
Pros and Cons of Data Transfer Objects
Как на пример туева хуча дата шейпов, чуть ли не на каждый запрос.
Да, ничего не поделаешь. Но не вижу особого ужаса в этом, просто грамотно по неймспейсам (каталогам) классифицируем "шейпы" в проекте и поддерживаем это добро. Зато какой порядок и чистота будет в BL, как легко будет поддерживать и развивать такую архитектуру. Мне кажется, с самого начала не стоит жмотиться DTO, и начинать сразу писать правильно.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108464
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУпрямо в коде MVC-контроллера берём сессию, строим запрос, бросаме результат во ViewModel. Просто, понятно, быстро, тестируемо. Profit.
Жесть, причем убийственная...
А что тут убийственного?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108466
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиА что тут убийственного?
Чтение БД с логикой в контроллере... Действительно, а что тут убийственного?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108469
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУДа, ничего не поделаешь. Но не вижу особого ужаса в этом, просто грамотно по неймспейсам (каталогам) классифицируем "шейпы" в проекте и поддерживаем это добро. Зато какой порядок и чистота будет в BL, как легко будет поддерживать и развивать такую архитектуру. Мне кажется, с самого начала не стоит жмотиться DTO, и начинать сразу писать правильно.

Ну это ладно, а скажем если я хочу добавить такую логику в модель:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 public class Product
    {
        public int ProductId { get; set; }
        public string Title { get; set; }
        public decimal Price { get; set; }
        public int Qty {get;set;}
        public int SaleType { get; set; }
        public decimal X {get;set;}
        public string ...
        public string ...
        public string ...
        public decimal Total
        {
            get { return Total * Qty; }
        }
        public decimal Discount
        {
            get { return SaleType == 0 ? Price + X : Price - X; }
        }
    }



И передать куда то такой дто:

Код: c#
1.
2.
3.
4.
5.
6.
  public class ProductDTO
    {
        public string Title { get; set; }
        public decimal Total { get; set; }
        public decimal Discount { get; set; }
    }



Как бы такое провернуть?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108482
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУГде-то в степиА что тут убийственного?
Чтение БД с логикой в контроллере... Действительно, а что тут убийственного?
какая логика, вытащить модель из базы и размазать по контроллеру - все в returne что бы не пачкать тело метода?
50 проц основные нужды..
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108483
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУГде-то в степиА что тут убийственного?
Чтение БД с логикой в контроллере... Действительно, а что тут убийственного?
какая логика, вытащить модель из базы и размазать по контроллеру вьюхе - все в returne что бы не пачкать тело метода?
50 проц основные нужды..
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108488
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонТо есть весь BL в контроллере?
МСУВ NH ты в любом случае будешь строить свой репо
МСУЖесть, причем убийственная...
Код: c#
1.
2.
3.
4.
5.
6.
session
.QueryOver<Order>
.Where(order => order.Client == client)
.Skip(0)
.Take(50)
.List()



Такой запрос использован один раз, прямо в контроллере. DAL, Repository и тд. уже есть в виде сессии, дополнительные обёртки не нужны. Логика в классе Order, а не в контроллере.
Усложнять код, вводя новые слои, классы и т.д. не нужно. В реале есть пара Extension методов для постраничной выборки.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108501
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosSeVa,

ну сама модель ОДата такая ж фигня как и ЕФ и т.д.
кроме Сущноси и Связи нет ничего
при это Сущность понимается как таблица в БД
нет понятия Схемы (именованный набор Связанных сущностей)

вот говрим Накладная и подазумрваем как минимум 2 Сущности - Шапка и Строки и связь между ними(в Випросе это макротип)
но в отдельности эти сущности нафиг никому не нужны кроме Мсушнего Идатасервис
Связь между Ш и С сильная
но тут же есть и слабыее связи - материал, ЕДИМ и т.д.
при задании схемы (макротипа) надо в мета указать сильные и слабые связи, направление зависимости и т.д.
а так из БД гоняете в БД
фигня все это

ViPRos, а не нужны никому эти жесткие связи и полное описание БД, тк смысл всех этих мультитков - уйти от зависимости структуры БД.Тк ООП и БД - две большие разницы. Помимо этого, нужны разные срезы данных(об этом говорилось в статье)
Вместо с танцев с бубнами для описания можно спокойно содать view за пять минут, запустить кодогенратор, а дальше если есть нормальный фреймворк, то больше делать ничего не нужно, все и так подхватится.
всесто БД - черный ящик, который предоставляет нужные интерфейсы. Помимо нее могут разные постащики данных(внешние сервисы, файлы, очереди сообщений, голубиная почта и тд).
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108504
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorLord BritishДавайте все же вернемся к EF, UOW, REPO и потроллим друг-друга на тему надо/не надо.
К сожалению, в тему заглянули только штатные тролли, поэтому развести дискуссию по существу будет напряжённо. :)

Могу лишь изложить поподробнее своё мнение. Сам прошёл путь Stored Procedure -> NHibernate -> Repository over Nhibernate -> NHibernate -> NoSQL (в процессе).

В общем, в процессе работы по принципу Repository over Nhibernate пришёл к пониманию, что мне просто не хватает возможностей, которые есть в NH, и я потихоньку привожу Repository к ISesson. В итоге просто выкинул ненужным мне слой. И чуть позже наткнулся на хорошие блоги по этой теме: раз , два , и (особенно для любителей SOLID'а) три . Сам я тоже любитель SOLID. Но кроме него, надо держать в голове и свой разум. Ибо видел совершенно "солидный", но абсолютно неподдерживаемый код.

И вдогонку. Вся эта суета вокруг слоёв вообще, и репозитория в частности задумывалась ради одной цели - сделать код более поддерживаемым за счёт повышения его понятности. И еще повторного использования кода. На самом деле, обычно гораздо проще для поддерживаемсяости использовать не горизонтальное деление - слои, а вертикальное - разделы. При этом используя как можно меньше псевдоабстракций. С повторным использованием, всё еще проще - 90% кода повторно не используется. На практике это выглядит так: прямо в коде MVC-контроллера берём сессию, строим запрос, бросаме результат во ViewModel. Просто, понятно, быстро, тестируемо. Profit.

Пока ты это проходил и искал, я это давно прошел и давно говорил тебе, что не нужно писать кипятком от твоего хибернейта.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108506
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorПарамонТо есть весь BL в контроллере?
МСУВ NH ты в любом случае будешь строить свой репо
МСУЖесть, причем убийственная...
Код: c#
1.
2.
3.
4.
5.
6.
session
.QueryOver<Order>
.Where(order => order.Client == client)
.Skip(0)
.Take(50)
.List()



Такой запрос использован один раз, прямо в контроллере. DAL, Repository и тд. уже есть в виде сессии, дополнительные обёртки не нужны. Логика в классе Order, а не в контроллере.
Усложнять код, вводя новые слои, классы и т.д. не нужно. В реале есть пара Extension методов для постраничной выборки.

Если подобная логика в классе Order, то ты забрел не в ту степь. И здесь не соблюдается постоянно тобой цитируемый SOLID
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108516
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nhibernate LazyLoading в многослойном приложении

Вот одна из типичных проблем при использовании всех ORM. Начинают лепить городухи для ленивой загрузки, а они рассчитаны только под чистый CRUD
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108526
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонКак бы такое провернуть?
Не понял, а в чем проблема?

Где-то в степиМСУЧтение БД с логикой в контроллере... Действительно, а что тут убийственного?
какая логика, вытащить модель из базы и размазать по контроллеру - все в returne что бы не пачкать тело метода?
50 проц основные нужды..
Чтение БД - это не логика, это чтение БД. А вот дальше идет логика. И тому и другому не место в контроллере.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108532
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУПарамонКак бы такое провернуть?
Не понял, а в чем проблема?

Где-то в степипропущено...

какая логика, вытащить модель из базы и размазать по контроллеру - все в returne что бы не пачкать тело метода?
50 проц основные нужды..
Чтение БД - это не логика, это чтение БД. А вот дальше идет логика. И тому и другому не место в контроллере.

Очередной детский лепет. Логика должна быть в контроллере
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108548
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaМСУпропущено...

Не понял, а в чем проблема?

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

Чтение БД - это не логика, это чтение БД. А вот дальше идет логика. И тому и другому не место в контроллере.

Очередной детский лепет. Логика должна быть в контроллере ты идиот?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108556
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сева, ты балбес

http://ru.wikipedia.org/wiki/Model-View-Controller

НазначениеОсновная цель применения этой концепции состоит в разделении бизнес-логики (модели) от её визуализации (представления, вида).

Наиболее частые ошибкиНачинающие программисты (особенно в веб-программировании, где аббревиатура MVC стала популярна) очень часто трактуют архитектурную модель MVC как пассивную модель MVC. В этом случае модель выступает исключительно совокупностью функций для доступа к данным, а контроллер содержит бизнес-логику
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108561
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУсева, ты балбес

http://ru.wikipedia.org/wiki/Model-View-Controller

НазначениеОсновная цель применения этой концепции состоит в разделении бизнес-логики (модели) от её визуализации (представления, вида).

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

1. Ты выше утверждал, что контроллер не должен содержать бизнес-логику, а теперь даешь ссылку, где утверждается совершенно обратное. Сам себя макнул в собственно дермецо.
2. Все твои mvc, mvp, о которых ты слышал только в теории и объеме wiki для Эллочек-людоедок, я давно уже попробовал на зуб и выкинул за полной их непригодностью.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108562
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУНе понял, а в чем проблема?

Нужно мапить модель к дто, а это лишняя дополнительная логика специально для дто.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108567
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонМСУНе понял, а в чем проблема?

Нужно мапить модель к дто, а это лишняя дополнительная логика специально для дто.

Это левые танцы с бубнами, которые показывают убогость чистого ORM
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108573
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa1. Ты выше утверждал, что контроллер не должен содержать бизнес-логику, а теперь даешь ссылку, где утверждается совершенно обратное. Сам себя макнул в собственно дермецо.
Тебе окончательно голову оторвало? Контроллер не должен содержать бизнес-логику, об этом пишется в статье. Ты читаешь жопой?
Наиболее частые ошибки => контроллер содержит бизнес-логику
Тебе даже википедию нельзя читать, иди пиродки пеки, бездарность.

SeVa2. Все твои mvc, mvp, о которых ты слышал только в теории и объеме wiki для Эллочек-людоедок, я давно уже попробовал на зуб и выкинул за полной их непригодностью.
Ты контроллер от модели отличить не можешь, дикарь, о каких зубах ты вещаешь? Иди в сад.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108576
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонНужно мапить модель к дто, а это лишняя дополнительная логика специально для дто.
А дто не должна отмапливать сама, этим должен заниматься маппер - отдельный класс с тупыми статическими методами.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108577
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaПарамонпропущено...
Нужно мапить модель к дто, а это лишняя дополнительная логика специально для дто.
Это левые танцы с бубнами, которые показывают убогость чистого ORM
Дурень, о ORM речт вообще не идет. Разговор об уровнях BL <=> DTO.
Пшел вон, не мешайся под ногами, ламер, пока дяди взрослые разговаривают.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108580
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa... ORM.... а они рассчитаны только под чистый CRUD

Конкретно EF и в простом CRUD может интересно себя повести. например, при включенном Concurency можно схватить ошибок при апдейтах Order/Details, когда изменяются только Details

Пример (многобукв)
Пусть есть Order/Details

Гавнакод, удаляет одну деталь и изменяет вторую.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
            using (var ctx = new DB1Entities())
            {
                var o = ctx.Orders.First();

                var od = o.Details.First();
                o.Details.Remove(od);
                ctx.OrderDetails.Remove(od);

                od = o.Details.First();
                od.Quantity = 7;

                DumpEntity(ctx);

                ctx.SaveChanges();
            }



Состояния entries в контексте Order - UNCHANGED
Код: sql
1.
2.
3.
System.Data.Entity.DynamicProxies.OrderDetail_B5EF51... - Modified
System.Data.Entity.DynamicProxies.OrderDetail_B5EF51... - Deleted
System.Data.Entity.DynamicProxies.Order_DFFC55BA5F8C... - Unchanged



В базу отправляются только два запроса, версия Order остается не изменна
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
exec sp_executesql N'update [dbo].[ORDER_DETAIL]
set [QUANTITY] = @0
where (([ID_ORDER_DETAIL] = @1) and ([VERSION] = @2))
select [VERSION]
from [dbo].[ORDER_DETAIL]
where @@ROWCOUNT > 0 and [ID_ORDER_DETAIL] = @1',N'@0 int,@1 int,@2 binary(8)',@0=7,@1=2,@2=0x00000000000007D7


exec sp_executesql N'delete [dbo].[ORDER_DETAIL]
where (([ID_ORDER_DETAIL] = @0) and ([VERSION] = @1))',N'@0 int,@1 binary(8)',@0=1,@1=0x00000000000007D6



Т. е. при конкурентном доступе, второй пользователь может не увидет этих изменений, если он не работал с измененной/удаленной деталью. Так как у Order версия не поменяется.

Чтобы работало как надо, прийдется вставить строчку

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
            using (var ctx = new DB1Entities())
            {
                var o = ctx.Orders.First();

                var od = o.Details.First();
                o.Details.Remove(od);
                ctx.OrderDetails.Remove(od);

                od = o.Details.First();
                od.Quantity = 7;

             ctx.Entry(o).State = System.Data.EntityState.Modified;

                DumpEntity(ctx);

                ctx.SaveChanges();
            }



И тогда все ОК, версия обновляется ОК.
Код: sql
1.
2.
3.
System.Data.Entity.DynamicProxies.OrderDetail_B5EF51... - Modified
System.Data.Entity.DynamicProxies.Order_DFFC55BA5F8C... - Modified
System.Data.Entity.DynamicProxies.OrderDetail_B5EF51... - Deleted



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
exec sp_executesql N'update [dbo].[ORDER]
set [ID_CUSTOMER] = @0, [ORDER_DATE] = @1, [SHIPMENT_COUNTRY] = @2, [SHIPMENT_CITY] = @3, [SHIPMENT_STREET] = @4, [SHIPMENT_BUILDING] = @5
where (([ID_ORDER] = @6) and ([VERSION] = @7))
select [VERSION]
from [dbo].[ORDER]
where @@ROWCOUNT > 0 and [ID_ORDER] = @6',N'@0 int,@1 datetime2(7),@2 nvarchar(50),@3 nvarchar(50),@4 nvarchar(50),@5 nvarchar(10),@6 int,@7 binary(8)',@0=1,@1='2013-01-13 22:54:55.2470000',@2=N'fqwef',@3=N'qwefqwef',@4=N'123r123r',@5=N'wefwef',@6=2,@7=0x00000000000007D8

exec sp_executesql N'update [dbo].[ORDER_DETAIL]
set [QUANTITY] = @0
where (([ID_ORDER_DETAIL] = @1) and ([VERSION] = @2))
select [VERSION]
from [dbo].[ORDER_DETAIL]
where @@ROWCOUNT > 0 and [ID_ORDER_DETAIL] = @1',N'@0 int,@1 int,@2 binary(8)',@0=7,@1=4,@2=0x00000000000007DA

exec sp_executesql N'delete [dbo].[ORDER_DETAIL]
where (([ID_ORDER_DETAIL] = @0) and ([VERSION] = @1))',N'@0 int,@1 binary(8)',@0=3,@1=0x00000000000007D9





И это Connected сценарий .
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108586
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУSeVa1. Ты выше утверждал, что контроллер не должен содержать бизнес-логику, а теперь даешь ссылку, где утверждается совершенно обратное. Сам себя макнул в собственно дермецо.
Тебе окончательно голову оторвало? Контроллер не должен содержать бизнес-логику, об этом пишется в статье. Ты читаешь жопой?
Наиболее частые ошибки => контроллер содержит бизнес-логику
Тебе даже википедию нельзя читать, иди пиродки пеки, бездарность.

SeVa2. Все твои mvc, mvp, о которых ты слышал только в теории и объеме wiki для Эллочек-людоедок, я давно уже попробовал на зуб и выкинул за полной их непригодностью.
Ты контроллер от модели отличить не можешь, дикарь, о каких зубах ты вещаешь? Иди в сад.

Я тебе миллион раз говорил, чтобы ты подтирался своей вики сам. Она только для этого пригодна. Я не собираюсь читать это и вникать в твою дурь.
Если не в контроллере, то где? В космосе, муфлон, она должна быть реализована? Во view и моdel ей не место
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108588
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot SeVa]МСУпропущено...

Тебе окончательно голову оторвало? Контроллер не должен содержать бизнес-логику, об этом пишется в статье. Ты читаешь жопой?
Наиболее частые ошибки => контроллер содержит бизнес-логику
Тебе даже википедию нельзя читать, иди пиродки пеки, бездарность.

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

Ты контроллер от модели отличить не можешь, дикарь, о каких зубах ты вещаешь? Иди в сад.

Я тебе миллион раз говорил, чтобы ты подтирался своей вики сам. Она только для этого пригодна. Я не собираюсь читать это и вникать в твою дурь.
Если не в контроллере, то где? В космосе, муфлон, она должна быть реализована? Только у мудаков она во view и моdel, которые ничего кроме вики в пять строк, осилить не могут
\
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108589
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ Попроси взрослых поменять тебе подгузники на ночь и не путайся под ногами
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108590
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaЯ тебе миллион раз говорил, чтобы ты подтирался своей вики сам. Она только для этого пригодна. Я не собираюсь читать это и вникать в твою дурь.
Дурень, тебе вникать просто нечем, это проблема не википедии, это проблема твой тупости. Обосрался ты сегодня знатно, очередной раз опускаем тебя на форуме. Какого оно, быть унылой кухаркой, поведай нем?

SeVaЕсли не в контроллере, то где? В космосе, муфлон, она должна быть реализована? Во view и моdel ей не место
Дятел тупорылый, в моделе и только в моделе. Не в контроллере, не во вью, не во вьюмоделе, не в репозитории. А в моделе. Заруби себе на носу, двоешник.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108592
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaЗЫ Попроси взрослых поменять тебе подгузники на ночь и не путайся под ногами
Знатно ты лажанулась сегодня, кухарочка. Знатно. Как раз попкорн подоспел
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108595
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУА дто не должна отмапливать сама, этим должен заниматься маппер - отдельный класс с тупыми статическими методами.
Понятно что не сама, но все таки необходимость лишних телодвижений.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108602
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонМСУА дто не должна отмапливать сама, этим должен заниматься маппер - отдельный класс с тупыми статическими методами.
Понятно что не сама, но все таки необходимость лишних телодвижений.
Маппер, одна строчка кода для намапливания целого экземпляра (для простых свойств).
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108604
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУМаппер, одна строчка кода для намапливания целого экземпляра (для простых свойств).
Для простых автомаппер.
Можно сделать отдельный класс для логики, получится чисто процедурный подход, но типизированный и с изоляцией )
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108609
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонМСУМаппер, одна строчка кода для намапливания целого экземпляра (для простых свойств).
Для простых автомаппер.
Можно сделать отдельный класс для логики, получится чисто процедурный подход, но типизированный и с изоляцией )
Да и автомаппер не нужен, еще левую сборку тянуть. Есть МСУ маппер :)
http://codearticles.ru/Home/ArticleView/1383

Так у нас же есть модель, там м логика хорошо ляжет. А валидация - во вью моделях.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108616
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Можно и так. Вообще стараюсь обходится простым projection по возможности.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108640
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaViPRos, а не нужны никому эти жесткие связи и полное описание БД, тк смысл всех этих мультитков - уйти от зависимости структуры БД.Тк ООП и БД - две большие разницы. Помимо этого, нужны разные срезы данных(об этом говорилось в статье)
Вместо с танцев с бубнами для описания можно спокойно содать view за пять минут, запустить кодогенратор, а дальше если есть нормальный фреймворк, то больше делать ничего не нужно, все и так подхватится.
всесто БД - черный ящик, который предоставляет нужные интерфейсы. Помимо нее могут разные постащики данных(внешние сервисы, файлы, очереди сообщений, голубиная почта и тд).
а я считаю что нафиг не нужны структурные классы в коде, их надо описывать в метаданных и все
а из метаданных создать БД и GUI
тогда все финтифлюшки тира ОРМ , ДТО, ... нафиг не нужны
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108771
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosтогда все финтифлюшки тира ОРМ , ДТО, ... нафиг не нужны
Датасеты?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108815
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

не объязательно
кеш можно построить на любых коллекциях
просто датасет уже готовая инфраструктура с релейшнами, констрейтами и т.д.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108926
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос для обсуждения. Есть репозиторий - стадарт КРУД + select ,where.
Задача - поиск по названию некой сущности. Реализцется как поиск по названию по 3 колонкам.
Вот куда это запихать лучше.
1. В интерфейс dao
2. Сделать напрямую в методе, которому это нужно.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108971
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosкеш можно построить на любых коллекциях
Вот он у нас и строится в EF на ICollection<T>.

ViPRosпросто датасет уже готовая инфраструктура с релейшнами, констрейтами и т.д.
В топку датасеты.

netivan
В репозиторий и клади или что-там у тебя. Насколько я знаю, ты куришь EF - уже копья сломал, нахрена тебе свой круд репозиторий, если в EF контекст и так уже репозиторий?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38108987
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

в EF контекст это UnitofWork. Но тут вопрос даже не конкретно к ЕФ, а теоретический)
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38109030
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa Nhibernate LazyLoading в многослойном приложении

Вот одна из типичных проблем при использовании всех ORM. Начинают лепить городухи для ленивой загрузки, а они рассчитаны только под чистый CRUD
Если в процессе забивания гвоздя бьёшь молотком по пальцу, в этом молоток виноват, да?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38109044
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanМСУ, в EF контекст это UnitofWork
Это не так.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38109322
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,
ну как же не так, когда так)
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110096
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorLord BritishДавайте все же вернемся к EF, UOW, REPO и потроллим друг-друга на тему надо/не надо.
К сожалению, в тему заглянули только штатные тролли, поэтому развести дискуссию по существу будет напряжённо. :)

Могу лишь изложить поподробнее своё мнение. Сам прошёл путь Stored Procedure -> NHibernate -> Repository over Nhibernate -> NHibernate -> NoSQL (в процессе).

В общем, в процессе работы по принципу Repository over Nhibernate пришёл к пониманию, что мне просто не хватает возможностей, которые есть в NH, и я потихоньку привожу Repository к ISesson. В итоге просто выкинул ненужным мне слой. И чуть позже наткнулся на хорошие блоги по этой теме: раз , два , и (особенно для любителей SOLID'а) три . Сам я тоже любитель SOLID. Но кроме него, надо держать в голове и свой разум. Ибо видел совершенно "солидный", но абсолютно неподдерживаемый код.

И вдогонку. Вся эта суета вокруг слоёв вообще, и репозитория в частности задумывалась ради одной цели - сделать код более поддерживаемым за счёт повышения его понятности. И еще повторного использования кода. На самом деле, обычно гораздо проще для поддерживаемсяости использовать не горизонтальное деление - слои, а вертикальное - разделы. При этом используя как можно меньше псевдоабстракций. С повторным использованием, всё еще проще - 90% кода повторно не используется. На практике это выглядит так: прямо в коде MVC-контроллера берём сессию, строим запрос, бросаме результат во ViewModel. Просто, понятно, быстро, тестируемо. Profit.

В три говорится только о необходимости перехода на чистый sql в долгосрочной ретроспективе. С принципам SOLID это можно сделать безболезненно, если им не следовать придется все перелопачивать.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110097
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorSeVa Nhibernate LazyLoading в многослойном приложении

Вот одна из типичных проблем при использовании всех ORM. Начинают лепить городухи для ленивой загрузки, а они рассчитаны только под чистый CRUD
Если в процессе забивания гвоздя бьёшь молотком по пальцу, в этом молоток виноват, да?

Бывают молотки, с которыми можно бить только себе по пальцам. Их нужно выбрасывать и все.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110106
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУSeVaЯ тебе миллион раз говорил, чтобы ты подтирался своей вики сам. Она только для этого пригодна. Я не собираюсь читать это и вникать в твою дурь.
Дурень, тебе вникать просто нечем, это проблема не википедии, это проблема твой тупости. Обосрался ты сегодня знатно, очередной раз опускаем тебя на форуме. Какого оно, быть унылой кухаркой, поведай нем?

SeVaЕсли не в контроллере, то где? В космосе, муфлон, она должна быть реализована? Во view и моdel ей не место
Дятел тупорылый, в моделе и только в моделе. Не в контроллере, не во вью, не во вьюмоделе, не в репозитории. А в моделе. Заруби себе на носу, двоешник.

Начинающий программист не делает различий между доменной логикой или бизнес-правилами(а'la: null, not null) и логикой приложения(бизнес логикой: отправить сообщение о поступлении оплаты, интеграция с внешними системами и тд).
Это две большие разницы. Или ты предлагаешь интеграцию с платежной системой засунуть в модель Payment?

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

SeVaНачинающий программист не делает различий между доменной логикой или бизнес-правилами(а'la: null, not null) и логикой приложения(бизнес логикой: отправить сообщение о поступлении оплаты, интеграция с внешними системами и тд).
Бездарь типа тебя не понимает, что предметная область в контроллере не пишется. Контроллер - тонкий Glue Layer, которому до бизнес-логики, как тебе до объектно-ориентированного программирования.

SeVaЭто две большие разницы. Или ты предлагаешь интеграцию с платежной системой засунуть в модель Payment?
Один уродец гадит, а второе дитятко эту каку в рот тащит.
Интеграция с платежной системой реализуется в предметной области - совокупность доменных объектов, один из которых - Payment . Шагом марш читать букварь, недоросль.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110132
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУSeVaБывают молотки, с которыми можно бить только себе по пальцам. Их нужно выбрасывать и все.
Один из таких молотков ты, бестолочь.

SeVaНачинающий программист не делает различий между доменной логикой или бизнес-правилами(а'la: null, not null) и логикой приложения(бизнес логикой: отправить сообщение о поступлении оплаты, интеграция с внешними системами и тд).
Бездарь типа тебя не понимает, что предметная область в контроллере не пишется. Контроллер - тонкий Glue Layer, которому до бизнес-логики, как тебе до объектно-ориентированного программирования.

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

Ну-ну, давай-ка подробней, умник. Есть модель Payment и большая куча поставщиков для проведения оплат. Что будут делать в этом случае детки, которые кроме вики ничего не видели? Расскажи и повесели на ночь
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110140
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaМСУпропущено...

Один из таких молотков ты, бестолочь.

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

Бездарь типа тебя не понимает, что предметная область в контроллере не пишется. Контроллер - тонкий Glue Layer, которому до бизнес-логики, как тебе до объектно-ориентированного программирования.

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

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

Ну-ну, давай-ка подробней, умник. Есть модель Payment и большая куча поставщиков для проведения оплат. Что будут делать в этом случае детки, которые кроме вики ничего не видели? Расскажи и повесели на ночь
Тупиздень, когда ты научишься думать. Создается новый конструктор, на входе которого будет подаваться Supplier, относительно которого будет поднотавливаться проводка. Причем тут контроллер?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110158
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУSeVaпропущено...


Ну-ну, давай-ка подробней, умник. Есть модель Payment и большая куча поставщиков для проведения оплат. Что будут делать в этом случае детки, которые кроме вики ничего не видели? Расскажи и повесели на ночь
Тупиздень, когда ты научишься думать. Создается новый конструктор, на входе которого будет подаваться Supplier, относительно которого будет поднотавливаться проводка. Причем тут контроллер?

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

Тупиздень, когда ты научишься думать. Создается новый конструктор, на входе которого будет подаваться Supplier, относительно которого будет поднотавливаться проводка. Причем тут контроллер?

Ну, муфел, теперь осталось сделать последние потуги и выяснить, что никакой логики взаимодействия с платежными системами в Payment быть не может.
Кухарка, ты сказала, что Payment это модель. Не путай божий дар с яичницей - дай угадаю, твоё скудное воображение «моделью» называет «дата-класс», предоставляющий абстракцию от БД? А теперь пшел вон читать букварь, в MVC модель - класс с бизнес логикой, никакого отношения к дата классу (EF, NH, L2S) не имеет. Опять двойка, садись.
Твоя детская задача даже второгодниками, а у тебя трудности.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110163
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaВернее, может, но только у мудаков, на которых ты ссылаешься
Чудила, ты не ответил. Ну-ка, заряди еще раз напалмом - ты весь расчет хочешь запихнуть в контроллер?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110175
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУSeVaпропущено...


Ну, муфел, теперь осталось сделать последние потуги и выяснить, что никакой логики взаимодействия с платежными системами в Payment быть не может.
Кухарка, ты сказала, что Payment это модель. Не путай божий дар с яичницей - дай угадаю, твоё скудное воображение «моделью» называет «дата-класс», предоставляющий абстракцию от БД? А теперь пшел вон читать букварь, в MVC модель - класс с бизнес логикой, никакого отношения к дата классу (EF, NH, L2S) не имеет. Опять двойка, садись.
Твоя детская задача даже второгодниками, а у тебя трудности.


Опять путаница в показаниях, чмошник. То у тебя Payment, то Provider, а теперь бредни с EF.
Что такое модель можешь писать статейки в русской вики , там твои бредни не будут выделяться на общем фоне.
И так внятно объясни, что где и как. Приплюсуй сюда еще отправку сообщения после оплаты.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110291
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaОпять путаница в показаниях, чмошник. То у тебя Payment, то Provider, а теперь бредни с EF.
Что такое модель можешь писать статейки в русской вики , там твои бредни не будут выделяться на общем фоне.
И так внятно объясни, что где и как. Приплюсуй сюда еще отправку сообщения после оплаты.
Чтобы что-то внятно объяснить унылой обезьяне, она должна обладать хоть малым представлением о уровене объектов предметной области. Учу неуча, классический MVP подход:
IDataProvider нужен для извлечения информации из БД (PaymentDb, PaymentDetailDb, PaymentTypeDb) и намапливания на DTO болванки (PaymentDTO)

Модель (Payment, а лучше назвать PaymentModel, чтобы не было путаницы с data-классами) взаимодействует с PaymentDTO и ISupplier и рассчитывает логику. new PaymentModel(ISupplier, PaymentDTO)

Контроллер тупо обращается к IDataProvider, инстанциирует PaymentModel и снимает расчет. Отправку данных по счетам или что там у тебя, реализуется точно так же в PaymentModel. Сам контроллер ни в коем случае не реализует бизнес логику, дурень.

P.S. Лишь в самых простых случаях некоторые идут на экономию (что-бы не плодить DTO) и пропихивают через контроллер в представление - сам data-класс (PaymentDb и иже). Впринципе, приемлемо для случаев, где особо никакой логики не нужно, кроме как вытащить данные из БД и отобразить их во вью.

RTFM: Model-View-Controller

Ты мне на вопрос ответишь? 13769830 Хочу еще поглумиться над идиотом.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110467
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУSeVaОпять путаница в показаниях, чмошник. То у тебя Payment, то Provider, а теперь бредни с EF.
Что такое модель можешь писать статейки в русской вики , там твои бредни не будут выделяться на общем фоне.
И так внятно объясни, что где и как. Приплюсуй сюда еще отправку сообщения после оплаты.
Чтобы что-то внятно объяснить унылой обезьяне, она должна обладать хоть малым представлением о уровене объектов предметной области. Учу неуча, классический MVP подход:
IDataProvider нужен для извлечения информации из БД (PaymentDb, PaymentDetailDb, PaymentTypeDb) и намапливания на DTO болванки (PaymentDTO)

Модель (Payment, а лучше назвать PaymentModel, чтобы не было путаницы с data-классами) взаимодействует с PaymentDTO и ISupplier и рассчитывает логику. new PaymentModel(ISupplier, PaymentDTO)

Контроллер тупо обращается к IDataProvider, инстанциирует PaymentModel и снимает расчет. Отправку данных по счетам или что там у тебя, реализуется точно так же в PaymentModel. Сам контроллер ни в коем случае не реализует бизнес логику, дурень.

P.S. Лишь в самых простых случаях некоторые идут на экономию (что-бы не плодить DTO) и пропихивают через контроллер в представление - сам data-класс (PaymentDb и иже). Впринципе, приемлемо для случаев, где особо никакой логики не нужно, кроме как вытащить данные из БД и отобразить их во вью.

RTFM: Model-View-Controller

Ты мне на вопрос ответишь? 13769830 Хочу еще поглумиться над идиотом.


Тупая обезьянка, где ты в MVP нашел контроллер? То, что ты описываешь, никакого отношения к этому паттерну не имеет.
И не скачи с ветки на ветку, ты утверждал, что вся бизнес-логика в МVС должна быть в Моdel. Опиши как этот бред будет выглядеть в этом случае. Забудь про свои DTO, EF и прочие мелочи, а то и так полный винегрет
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110488
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa Или ты предлагаешь интеграцию с платежной системой засунуть в модель Payment?

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

У вас модель это просто структура + дал, как я понял?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110522
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaТупая обезьянка, где ты в MVP нашел контроллер? То, что ты описываешь, никакого отношения к этому паттерну не имеет.
Глупая кухарка, а где я что-то сказал про "контроллер в MVP"? У тебя, как всега, галлюцинации, купи очки и еще раз прочитай: речь о IDataService - это чисто MVP-шная фишка.

SeVaИ не скачи с ветки на ветку, ты утверждал, что вся бизнес-логика в МVС должна быть в Моdel. Опиши как этот бред будет выглядеть в этом случае. Забудь про свои DTO, EF и прочие мелочи, а то и так полный винегрет
Дятел, я тебе обрисовал 100% реализации задачи, как это делается, что тебе еще непонятно? Винегрет у тебя в голове, которая в контроллеры "бизнес-логику" засовывает. Иди учи матчасть, бестолочь. Тебе уже и Парамон вдалбливает в твой неокрепший моск, что логика с платежной системой инкапсулируется в некий класс - я тебя битый час уже вменяю о PaymentModel. Логика только в нем, а никак не в контроллере.

P.S. Сева, ты опущенец.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110523
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонSeVa
Оплата ведь может происходить в разных контроллерах, не дублировать же логику.
Он этого не понимает. Более того, он не знает, что в том же ASP.NET MVC специфичный контроллер (только для этой платформы) и если потребуется логику перенести на тот же толстый клиент WPF, WinForms, Mobile, ... то контроллер уйдет в топку - нужен будет новый контроллер. В его случае он будет дублировать бизнес-логику.
P.S. Очередный Севины бредни идиота...
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110530
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa, ты ссылку читал?



Что не ясно из схемы? Контроллер через сервис (у меня это некий IDataService) взаимодействует с моделью (бизнес логика) и представлением, представление тупо берет из модели посчитанные данные и отрисовывает. Сходи в садик, там тебе дети разжуют.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110644
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУSeVa, ты ссылку читал?



Что не ясно из схемы? Контроллер через сервис (у меня это некий IDataService) взаимодействует с моделью (бизнес логика) и представлением, представление тупо берет из модели посчитанные данные и отрисовывает. Сходи в садик, там тебе дети разжуют.

Ну, хоты бы что-то внятное.
А теперь нарисуй диаграмму для такого Use case:

1.Провести оплату через провайдера.
2. Если оплата прошла успешно, то сопоставить ее с неоплаченными счетами. Если нет, то показать ошибку пользователю
3. Передать данные об оплате в 1С
4. Всем полностью оплаченным Счетам изменить статус на Оплачено.
5. Если есть полностью оплаченные Счета, то :
- произвести уведомление Менеджеров по e-mail
- запустить складской процесс по резервированию на складе
- etc
- etc

Где здесь бизнес-логика и как ты ее будешь реализовывать исключительно в Мodel? Процессов несколько, возможны ветвления кто и как будет проводить их оркестровку?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110729
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaМСУSeVa, ты ссылку читал?



Что не ясно из схемы? Контроллер через сервис (у меня это некий IDataService) взаимодействует с моделью (бизнес логика) и представлением, представление тупо берет из модели посчитанные данные и отрисовывает. Сходи в садик, там тебе дети разжуют.

Ну, хоты бы что-то внятное.
А теперь нарисуй диаграмму для такого Use case:

1.Провести оплату через провайдера.
2. Если оплата прошла успешно, то сопоставить ее с неоплаченными счетами. Если нет, то показать ошибку пользователю
3. Передать данные об оплате в 1С
4. Всем полностью оплаченным Счетам изменить статус на Оплачено.
5. Если есть полностью оплаченные Счета, то :
- произвести уведомление Менеджеров по e-mail
- запустить складской процесс по резервированию на складе
- etc
- etc

Где здесь бизнес-логика и как ты ее будешь реализовывать исключительно в Мodel? Процессов несколько, возможны ветвления кто и как будет проводить их оркестровку?

О, беседа вернулась в конструктивное русло.

Пишу с утюга, потому немношословен буду. Что вы понимаете под Model?

Если Domain Model, то помимо Entity и Value objects в ней могут быть Domain Services, в них можно выносить логику, которой необходимо взаимодействовать с несколькими Entity/другими domain service'ами/посредством интерфесов с другими системами. Картинка выше останется без изменений. Вы сможете вызвать при таком подходе логику откуда угодно в пределах приложения или в разных приложениях, также протестиоовать сможете легко. У всяких фаулеров описано же.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110758
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110768
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по ссылке As such some examples may help.
Entities are usually big things like
Customer, Ship, Rental Agreement.
Values are usually little things like
Date, Money, Database Query.
Services are usually accesses to
external resources like Database
Connection, Messaging Gateway,
Repository, Product Factory.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110793
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaНу, хоты бы что-то внятное.
Тебе об этом "внятном" уже битый день тылдычат.

SeVaА теперь нарисуй диаграмму...
Ага, только сейчас возьму разбег.

SeVa1.Провести оплату через провайдера.
2. Если оплата прошла успешно, то сопоставить ее с неоплаченными счетами. Если нет, то показать ошибку пользователю
3. Передать данные об оплате в 1С
4. Всем полностью оплаченным Счетам изменить статус на Оплачено.
5. Если есть полностью оплаченные Счета, то :
- произвести уведомление Менеджеров по e-mail
- запустить складской процесс по резервированию на складе
- etc
- etc

1.

Код: c#
1.
2.
var model = new PaymentModel(PaymentDto, IProivider);
model.Pay();



2.

Код: c#
1.
model.Compare();



3. Это интеграция, решается асинхронно и в другом контексте (Windows сервис, SSIS и т.д.). Задача не для PaymentModel.

4. Задача решается в другом контексте (Windows сервис, SSIS и т.д.). Задача не для PaymentModel.

5. Задача решается в другом контексте (Windows сервис, SSIS и т.д.). Задача не для PaymentModel.

SeVaГде здесь бизнес-логика и как ты ее будешь реализовывать исключительно в Мodel? Процессов несколько, возможны ветвления кто и как будет проводить их оркестровку?
Правильно, мухи отдельно, котлеты отдельно. Мухи - в модели, оркестрарий - в отдельном контексте.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38110967
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Никаких провайдерова в Payment быть не должно. Пользуясь твоей терминологией: мухи и котлеты отдельно
2. Какая-то хрень
3,4,5 и тд решаются не в Model

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

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

к примеру:
Код: c#
1.
2.
3.
bool IsSuccess = DoPayment(someValue);
if (IsSuccess)
   DoSomeUpdate();



Все эти методы тоже будут в контроллере?
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38111101
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa1. Никаких провайдерова в Payment быть не должно. Пользуясь твоей терминологией: мухи и котлеты отдельно
Что такое у тебя Payment? Дата класс? Ни в дата классе, ни в DTO никаких провайдеров не должно быть. В PaymentModel (если логики много - можно и через некий new PaymentService(PaymentModel)) - должен быть провайдер, о котором ты писал выше. В данном случае в PaymentModel - бизнес логика, если у нас некий PaymentService - то логика размазывается и на него. Но это для особо замороченных случаев. Тебе рано про них еще знать.

SeVa2. Какая-то хрень
...у тебя в голове.

SeVa3,4,5 и тд решаются не в Model
А ч о чем.

SeVaВ итоге никакой логики кроме persistens, мелких вычислений, элементарных проверок в ней быть не должно.
В твоих русскоязычных вики пачкают только такие как ты, а ты это потом эут шняго развозишь по форуму
Интеграция между системами - это не логика модели. Периодическая проверка в неком сервисе и апдейт поля по какому-то признаку и рассылка - это не логика модели. Наличие признака и проверка его - это логика. У тебя каша в голове.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38111160
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,
Модель это просто передатчик (транспортная абстакция) если смотреть в дуплексном виде, между вьюхой и контроллером
логику там зашивать я не вижу смысла, ну окромя валидации или трансляции подписки на изменение модели
в двух словах это выглядит примерно так.
Код: c#
1.
2.
3.
4.
5.
  public ActionResult Payment(PaymentModel item)
        {
            PaymentSystem<Payment>>.ActivatePayment(item);
            return View(item);
        }


тут имеем все для проводки, результаты вкидываем обратно, вся логика на стороне.
логика тут вообще по стороне, ее вообще может не быть
если контроллер транслирует в одну сторону в плане модели
Код: c#
1.
2.
3.
4.
 public ActionResult Payment(int? id)
        {
           return View(ses.Query<Content>().Limit(id,1).First());
        }

[/SRC]
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38111178
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиМСУ, Модель это просто передатчик (транспортная абстакция) если смотреть в дуплексном виде, между вьюхой и контроллером
Если называть дата-модель (классы ORM) - моделью (в терминах MVC), то да. Но использовать дата-модель в качестве модели в MVC - моветон. Выльется боком. Итого, модель не просто передатчик, а именно класс с бизнес-логикой.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38111235
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,
Почему использование дата модели в трансляции в одностороннем порядке может выльется ?
дата это простая абстракция, я ведь могу подкинуть сахарку, и будет как в первом классе:

Код: c#
1.
2.
3.
4.
5.
 public ActionResult Payment(int? id)
{
         Content сontent =   new Content(id)
    return View(сontent);
 }
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38111245
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУSeVa1. Никаких провайдерова в Payment быть не должно. Пользуясь твоей терминологией: мухи и котлеты отдельно
Что такое у тебя Payment? Дата класс? Ни в дата классе, ни в DTO никаких провайдеров не должно быть. В PaymentModel (если логики много - можно и через некий new PaymentService(PaymentModel)) - должен быть провайдер, о котором ты писал выше. В данном случае в PaymentModel - бизнес логика, если у нас некий PaymentService - то логика размазывается и на него. Но это для особо замороченных случаев. Тебе рано про них еще знать.

SeVa2. Какая-то хрень
...у тебя в голове.

SeVa3,4,5 и тд решаются не в Model
А ч о чем.

SeVaВ итоге никакой логики кроме persistens, мелких вычислений, элементарных проверок в ней быть не должно.
В твоих русскоязычных вики пачкают только такие как ты, а ты это потом эут шняго развозишь по форуму
Интеграция между системами - это не логика модели. Периодическая проверка в неком сервисе и апдейт поля по какому-то признаку и рассылка - это не логика модели. Наличие признака и проверка его - это логика. У тебя каша в голове.

Это у вас каша и писсуары в головах.
авторЕсли называть дата-модель (классы ORM) - моделью (в терминах MVC), то да. Но использовать дата-модель в качестве модели в MVC - моветон. Выльется боком. Итого, модель не просто передатчик, а именно класс с бизнес-логикой.

В огороде бузина, а в Киеве дядька.

Все "если,то" выше - это и есть бизнес-логика, которую нужно обеспечивать и делается это не в Model

и не в одной строчке очередного маразма из серии DataService
автор PaymentSystem<Payment>>.ActivatePayment(item);


В общем понятно, что ничего подобного ты не делал. Ковыряйся в говнокоде дальше и не вякай.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38111262
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,
имхо я не согласен ни с тобой ни с севой, с моего имхо модель это "транспортный протокол" для функционирования системы
представления, можно всунуть в нее бизнеслогику, можно и в контроллер ( это все стерпит)
но все же если какие то действия нужно предпринимать на основе данных модели с клиента, все это надо выносить отдельно.
что бы можно было, менять эти действия не трогая модель и контроллер.
Если бл в контроллере предполагает это, почему бы нет, если в модели опять почему бы нет.
Исходить нужно из изоляции -> тестирования и понятности кода для сопровождения.
зы если рассуждать по стеку то стек всегда поднимется в контроллер, отсюда можно пошутить ( прагматично),
что бл всегда будет в сонтроллере
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38111277
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa
автор PaymentSystem<Payment>>.ActivatePayment(item);


В общем понятно, что ничего подобного ты не делал. Ковыряйся в говнокоде дальше и не вякай.
Сева ты как упрямый фома
В одном переулке
Стояли дома.
В одном из домов
Жил упрямый Фома.

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

SeVaВ огороде бузина, а в Киеве дядька. Все "если,то" выше - это и есть бизнес-логика, которую нужно обеспечивать и делается это не в Model
и не в одной строчке очередного маразма из серии DataService
Ты просто ушлепок - логика в контроллере не маразм? Иди читай буквари, недоросль, рано тебе еще на форумах выступать.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38111399
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиМСУ, Почему использование дата модели в трансляции в одностороннем порядке может выльется ?
Я сто раз уже писал - независимость от ORM , бесшовная имплементация любого хранилища.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38111417
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,
а ты в этом смысле, ну почему же нет, вот и придумал к нему застежку
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38111441
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиМСУ,
а ты в этом смысле, ну почему же нет, вот и придумал к нему застежку
Да в любых смыслах, база - это база, предметный слой - это предметый слой.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38111468
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУГде-то в степиМСУ, Почему использование дата модели в трансляции в одностороннем порядке может выльется ?
Я сто раз уже писал - независимость от ORM , бесшовная имплементация любого хранилища.


Детский потуги говнокодера. Муся, предлагаю этому чудо-сервису дать название "Сделайте мне красиво".
Чистый маппинг никому не нужен.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38111474
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиSeVaпропущено...


В общем понятно, что ничего подобного ты не делал. Ковыряйся в говнокоде дальше и не вякай.
Сева ты как упрямый фома
В одном переулке
Стояли дома.
В одном из домов
Жил упрямый Фома.

Ни дома, ни в школе,
Нигде, никому -
Не верил
Упрямый Фома
Ничему.
Приведи хоть пример своего - говнокода, вот честно сказать смотрю на твои посты где соглашаюсь где нет
Но не разу в жизни не видел ни одной пделки от тебя ни одного примера. ну как так можно голословно
и безапеляционно AAAA?


С моими поделками даже с тебя можно было бы стакан молока поиметь, после недели дрессировки, чтобы выучил несколько незамысловатых правил, тк кода нужно минимум
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38111481
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaДетский потуги говнокодера. Муся, предлагаю этому чудо-сервису дать название "Сделайте мне красиво".
Чистый маппинг никому не нужен.
Иди в зоопарк, предложи писать логику в контроллере. Звери посмеются.

SeVaС моими поделками даже с тебя можно было бы стакан молока поиметь, после недели дрессировки, чтобы выучил несколько незамысловатых правил, тк кода нужно минимум
Да нету у тебя никаких поделок и небыло, все твои посты на форуме - пук в кусты. Да и чмырят тебя все кому не лезь, что не пост - то в мемориз.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38111497
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУSeVaДетский потуги говнокодера. Муся, предлагаю этому чудо-сервису дать название "Сделайте мне красиво".
Чистый маппинг никому не нужен.
Иди в зоопарк, предложи писать логику в контроллере. Звери посмеются.

SeVaС моими поделками даже с тебя можно было бы стакан молока поиметь, после недели дрессировки, чтобы выучил несколько незамысловатых правил, тк кода нужно минимум
Да нету у тебя никаких поделок и небыло, все твои посты на форуме - пук в кусты. Да и чмырят тебя все кому не лезь, что не пост - то в мемориз.

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

SeVaОдним говоришь, что применяй такой-то и такой-то паттерн, другим приходится полчаса объяснять что они из себя представляют, а ты у нас особый случай, тк нужен минимум год, чтобы до тебя что-то дошло.
Ты как был тупизднем, так им и останешься - я рассуждал только об одном паттерне, MVC (и MVP как производная). О IDataService это не паттерн, модель это не паттерн, контроллер это не паттерн. Перечитай ссылку на MS определения, хотя с твоим английским только кур ходить смешить. Даже дети поняли о чем речь, только у тебя у одно возникают вопросы. О чем это говорит?

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

А теперь нарисуй диаграмму для такого Use case:

1.Провести оплату через провайдера.
2. Если оплата прошла успешно, то сопоставить ее с неоплаченными счетами. Если нет, то показать ошибку пользователю
3. Передать данные об оплате в 1С
4. Всем полностью оплаченным Счетам изменить статус на Оплачено.
5. Если есть полностью оплаченные Счета, то :
- произвести уведомление Менеджеров по e-mail
- запустить складской процесс по резервированию на складе
- etc
- etc

Где здесь бизнес-логика и как ты ее будешь реализовывать исключительно в Мodel? Процессов несколько, возможны ветвления кто и как будет проводить их оркестровку?


Попробовал запилить согласно подходу DDD (Eric Evans - Domain Driven Design). В инфраструктурном слое, считаем что для интерфейсов реализации тупо ставят в очередь и возвращают управление сразу (а уже другие системы никак не связанные с этой занимаются рассылкой и т. п.). Иначе долго это все набивать на клаве всякие асинхронные вызовы/воркфлоу и т. п.. В приложении также портянка Sequence диаграм. Пример только чтобы показать какая логика где находится при подходе DDD.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38112226
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я совершенно не не знаком с предметной областью типа - банковская сфера, бухгалтерия и т. п.. Потому не зная, как оно семантически правильно называется на английском писал на русском.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38112239
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слои разбиты по неймспейсам, для примера не принципиально, в голове можем считать что это сборки.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38113162
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord BritishSeVa...

А теперь нарисуй диаграмму для такого Use case:

1.Провести оплату через провайдера.
2. Если оплата прошла успешно, то сопоставить ее с неоплаченными счетами. Если нет, то показать ошибку пользователю
3. Передать данные об оплате в 1С
4. Всем полностью оплаченным Счетам изменить статус на Оплачено.
5. Если есть полностью оплаченные Счета, то :
- произвести уведомление Менеджеров по e-mail
- запустить складской процесс по резервированию на складе
- etc
- etc

Где здесь бизнес-логика и как ты ее будешь реализовывать исключительно в Мodel? Процессов несколько, возможны ветвления кто и как будет проводить их оркестровку?


Попробовал запилить согласно подходу DDD (Eric Evans - Domain Driven Design). В инфраструктурном слое, считаем что для интерфейсов реализации тупо ставят в очередь и возвращают управление сразу (а уже другие системы никак не связанные с этой занимаются рассылкой и т. п.). Иначе долго это все набивать на клаве всякие асинхронные вызовы/воркфлоу и т. п.. В приложении также портянка Sequence диаграм. Пример только чтобы показать какая логика где находится при подходе DDD.


Молодец, весьма неплохо.
Код: 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.
 using (var uow = UnitOfWorkFactory.Create())
                {
                    var неОплаченныеСчета = РаботаСоСчетами.ПолучитьНеОплаченныеСчета(uow);
                
                    var оплаченныеСчета = СопоставитьНеОплаченныеСчета(
                        неОплаченныеСчета, paymentResponse.Items);

                    foreach (var счет in оплаченныеСчета)
                    {
                        var systemLike1cResponse = _systemLike1C.SyncPaymentData(new SystemLike1CSpecificParameter());
                        if (!systemLike1cResponse.IsDone)
                            throw new SystemLike1CFaultException();

                        var notifyResponse = _notificationService.Notify(new NotificationSystemSpecificParameter());
                        if (!notifyResponse.IsDone)
                            throw new NotificationServiceFaultException();

                        var stockResponse = _stockSystem.StartReservationProcess(new StockSystemSpecificParameter());
                        if (!systemLike1cResponse.IsDone)
                            throw new StockSystemFaultException();
                    }

                    РаботаСоСчетами.ПометитьСчетаКакОплаченные(оплаченныеСчета);

                    uow.SaveAllChanges();
                }



SyncPaymentData,_notificationService.Notify,_stockSystem.StartReservationProcess лучше всего выполнять в отложенном режиме и здесь весьма неплохо подходит CQRS и очереди сообщений с гарантированной доставкой. Сейчас поздно, завтра продолжим
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38114634
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa,

Читаю сейчас о CQRS и Event Sourcing Фаулера и Грега Янга. Пока нет полной картины где ему место. Можете рассказать об опыте применения CQRS или может быть хорошо теоретически знаете этот подход было бы интересно почитать мнения о границах применимости, о целях применения и т. п.. И где ему место в этом примере.

Пока что видится на основе прочитанного, что пытаются разделить писателей и читателей на всех уровнях, вероятно, с целью оптимизации отдельно Write БД и Read БД.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38114661
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этом примере хоть я и брякнул, что

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


На деле из задействованных в примере сервисов при таких вызовах

авторvar systemLike1cResponse = _systemLike1C.SyncPaymentData(new SystemLike1CSpecificParameter());

var notifyResponse = _notificationService.Notify(new NotificationSystemSpecificParameter());

var stockResponse = _stockSystem.StartReservationProcess(new StockSystemSpecificParameter());


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

дле сервиса оплаты (что-то вроде банк клиента?) - надо получить возможно еще какие-то данные от платежной системы и т. п.. потому одной очередью тут не отделаться.

для сервиса синхронизации с 1С или ей подобной - я даже не знаю что это за процесс, но уверен он долгоиграющий и данные от 1С тоже нужны

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

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

Опять же цель примера была посмотреть какая логика каком слою относится. Но теперь итересно уже другое - вот те моменты что описаны выше.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38115179
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord British, Эрик Эванс фанат-теоретик DDD, хотя для общего ознакомления не воспрещается, конечно. Больше всего опасен фанатизм, видится мне.
Простой слабоствязный компонент: ApplicationUI + ApplicationLayer + InfrastructureLayer. Меняешь свой ApplicationLayer на что-то другое, ApplicationUI продолжает так же работать.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38115188
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка, конечно же IDataService в MVC контроллере.

Код: c#
1.
2.
3.
4.
public class BaseController : Controller
{
    public IDataService Service { get; private set; }
}
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38115884
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord BritishВ этом примере хоть я и брякнул, что

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


На деле из задействованных в примере сервисов при таких вызовах

авторvar systemLike1cResponse = _systemLike1C.SyncPaymentData(new SystemLike1CSpecificParameter());

var notifyResponse = _notificationService.Notify(new NotificationSystemSpecificParameter());

var stockResponse = _stockSystem.StartReservationProcess(new StockSystemSpecificParameter());


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

дле сервиса оплаты (что-то вроде банк клиента?) - надо получить возможно еще какие-то данные от платежной системы и т. п.. потому одной очередью тут не отделаться.

для сервиса синхронизации с 1С или ей подобной - я даже не знаю что это за процесс, но уверен он долгоиграющий и данные от 1С тоже нужны

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

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

Опять же цель примера была посмотреть какая логика каком слою относится. Но теперь итересно уже другое - вот те моменты что описаны выше.

Это прокатит для всех процессов, которые я перечислил, мало того, пригодно только отложенное выполнение, но для этого нужны очереди сообщений.
Реальные варианты:
- клиент приходит и оплачивает товары или услуги, ему мало интересно ждать и никто не будет держать его на время передачи данных в другие системы(нет соединения, идет закрытие месяца в 1С или накатываются изменения). Или если проблемы в одной из систем, то все остальные бизнес-процессы могут выполнятся тк в большинстве случаев они независимы(например, кладовщики для отправки груза после оплаты, могут даже не знать, что отправлялось сообщение о получении оплаты, а клиенту гораздо важнее полученный груз).
Из того, что доводилось делать по подобной схеме в трех разных проектах(использовалась связка nCQRS c вправленными мозгами и nServiceBus):
- обмен данными между распределенными БД и другими системами
- запуск бизнес-процессов, получение данных из внешних систем

В контроллере добавляется одна строчка CommadBus.Send(new PaymentCommad(payment));
Дальше нужно создать агрегированный домен и независимые обработчик событий. Поскольку в большинстве вариантов они независимы друг от друга, то это позволяет расширять систему с горизонтальным ростом сложности, а не вертикальным с перелопачиванием всего кода.
Рекомендую CQRS Journey
. Есть отличный букварь в том числе на русском и код с реальным примером.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38116126
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa,

Вот, при более подробном описании процессов многое прояснилось. А то я даже не знал в какой степени эти процессы не зависимы и т. п..

Отдельное спасибо за ссылку, поставил в список на изучение. Как изучу, отыщу вас тут на форуме. Буду вопросы задавать.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38127979
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2SeVa: киньте ссылку пожалуйста на "отличный букварь в том числе на русском", чего-то не нашел
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38128292
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP19832SeVa: киньте ссылку пожалуйста на "отличный букварь в том числе на русском", чего-то не нашел

Видел только в печатном варианте(MIcrosoft Press)
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38141972
maratoss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В попытках понять UoW + Repository возник небольшой вопросик, как быть в такой ситуации?
Код: 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.
public Add(A a)
{
   using (var uow = MyFakeUnitOfWorkFactory.Create())
   {
       var repo = uow.GetRepository<A>();
       repo.Insert(a);
       uow.SaveAllChanges();
   }
}
public Bind(A a, B b)
{
   using (var uow = MyFakeUnitOfWorkFactory.Create())
   {
       var repo = uow.GetRepository<C>();
       var c = new C { A = a , B = b};
       repo.Insert(c);
       uow.SaveAllChanges();
   }
}
public BindAndCreateIfNotExist(A a, B b)
{
   using (var uow = MyFakeUnitOfWorkFactory.Create())
   {
       var repo = uow.GetRepository<A>();
       if (!repo.IsExist(a))
       {
           Add(a);
       }
       Bind(a, b); // ??? как откатить изменения Add(a), если тут произошел exception?
       uow.SaveAllChanges();
   }
}
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38142109
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maratoss,

не щекоча кишки EF никак, если хочется этой абстракции можно в интерфейс IUnitOfWork ввести метод Undo() или как вы его назавете и в реализации EfUnitOfWork реализовать метод. Я так и не понял выгоды от введения своих интерфейсов, (кроме тестирования с фэйко контекстами) в сложном приложении с поддержкой optimistic concurency и т. п.. это все выродится в исходные реализации EF context,dbset.

поделитесь впечатлением от подхода по окончанию... интересно почитать.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38142823
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord Britishmaratoss,

не щекоча кишки EF никак, если хочется этой абстракции можно в интерфейс IUnitOfWork ввести метод Undo() или как вы его назавете и в реализации EfUnitOfWork реализовать метод. Я так и не понял выгоды от введения своих интерфейсов, (кроме тестирования с фэйко контекстами) в сложном приложении с поддержкой optimistic concurency и т. п.. это все выродится в исходные реализации EF context,dbset.

поделитесь впечатлением от подхода по окончанию... интересно почитать.


Undo\Redo должен быть в моделе. Модель должна быть комплексной в виде графа, тогда не будет костылей а'la BindAndCreateIfNotExist(A a, B b).
О том как это сделано без собственных лисапедов можно почитать и посмотреть в csla
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38142901
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa,

наверное это зависит про какое undo/redo ведется речь, если ему при редактировании отдельной ентити надо отменить что-то IEditableObject есть, а если ему что-то вроде Rollback или Revert в противовес SaveChanges это уже другое. Я о последнем писал, помоему ему это надо.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38142919
maratoss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord Britishнаверное это зависит про какое undo/redo ведется речь, если ему при редактировании отдельной ентити надо отменить что-то IEditableObject есть, а если ему что-то вроде Rollback или Revert в противовес SaveChanges это уже другое. Я о последнем писал, помоему ему это надо.

Да, хотел узнать,
в ситуации когда метод вызывает другие два, каким образом можно выполнить их в одной транзакции, чтобы можно было сделать rollback, если что-то пошло не так.

SeVaО том как это сделано без собственных лисапедов можно почитать и посмотреть в csla
Сейчас посмотрим.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38142998
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maratossLord Britishнаверное это зависит про какое undo/redo ведется речь, если ему при редактировании отдельной ентити надо отменить что-то IEditableObject есть, а если ему что-то вроде Rollback или Revert в противовес SaveChanges это уже другое. Я о последнем писал, помоему ему это надо.

Да, хотел узнать,
в ситуации когда метод вызывает другие два, каким образом можно выполнить их в одной транзакции, чтобы можно было сделать rollback, если что-то пошло не так.



если вопрос только технический касаемо EF, то так
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace ConsoleApplication14
{
    class Program
    {
        static void Main(string[] args)
        {
            var txOpt = new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted };
            using (var tx = new TransactionScope(TransactionScopeOption.RequiresNew, txOpt))
            {
                Method1();
                Method2();

                // Не вызовите сomplete, будет rollback на уровне ресурсов, которые участвовали в ambient транзакции
                tx.Complete();
            }
        }

        protected static void Method1()
        {
            using (var ctx = new DB1Entities())
            {
                var t1 = ctx.T1.First(o => o.ID == 1);
                t1.NAME = 3;

                // Участвует в ambient транзакции, если Enlist = true, иначе свою создаст
                ctx.SaveChanges();
            }
        }

        protected static void Method2()
        {
            using (var ctx = new DB1Entities())
            {
                var t1 = ctx.T1.First(o => o.ID == 2);
                t1.NAME = 4;

                // Работает на уровне контекста
                if (...)
                    ctx.RevertAllChanges();

                // Участвует в ambient транзакции, если Enlist = true, иначе свою создаст
                ctx.SaveChanges();
            }
        }
    }

    public static class EfHelper
    {
        public static void RevertAllChanges(this DbContext ctx)
        {
            foreach (var entry in ctx.ChangeTracker.Entries())
                entry.State = EntityState.Unchanged;
        }
    }
}


...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38143016
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maratoss, состояния Entity в памяти, тоже можно привязать к TransactionScope, чтобы по rollback оно делало Revert. Я не касаюсь зачем это может быть нужно, просто есть такая техническая возможность. Может запилю пример попозже, если интересно.
...
Рейтинг: 0 / 0
EF, Repository, UnitOfWork
    #38143779
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
простейший memory-ресурс, участвовать может только в одной транзакции и контролировать только value-типы, по факту случай вырожден до тупой обработки уведомлений о commit/rollback
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace ConsoleApplication15
{
    public sealed class FakeTransactionalResource<T> : ISinglePhaseNotification
    {
        private T _oldObj;

        private T _obj;
        public T Obj
        {
            get { return _obj; }
            set { _obj = value; }
        }

        public FakeTransactionalResource(T obj)
            : this(obj, true)
        {
        }

        public FakeTransactionalResource(T obj, bool enlist)
        {
            _oldObj = obj;
            _obj = obj;

            if (enlist)
                Enlist();
        }

        public void Enlist()
        {
            Transaction.Current
                .EnlistVolatile(this, EnlistmentOptions.None);
        }

        #region ISinglePhaseNotification
        void ISinglePhaseNotification.SinglePhaseCommit(SinglePhaseEnlistment singlePhaseEnlistment)
        {
            Commit();

            singlePhaseEnlistment.Committed();
        }

        void IEnlistmentNotification.Commit(Enlistment enlistment)
        {
            throw new NotImplementedException();
        }

        void IEnlistmentNotification.InDoubt(Enlistment enlistment)
        {
            enlistment.Done();
        }

        void IEnlistmentNotification.Prepare(PreparingEnlistment preparingEnlistment)
        {
            preparingEnlistment.Prepared();
        }

        void IEnlistmentNotification.Rollback(Enlistment enlistment)
        {
            _obj = _oldObj;
        }

        private void Commit()
        {
            _oldObj = _obj;
        }

        #endregion
    }
}




пример использования
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
            FakeTransactionalResource<int> ftr = null;

            var txOptions = new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted };
            using (var tx = new TransactionScope(TransactionScopeOption.RequiresNew, txOptions))
            {
                ftr = new FakeTransactionalResource<int>(1);

                ftr.Obj = 5;

                Console.WriteLine("Before rollback {0}", ftr.Obj);
                //tx.Complete();
            }

            Console.WriteLine("After rollback {0}", ftr.Obj); // напечатает 1




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


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