powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Грамотная архитектура приложения на ASP.NET MVC
25 сообщений из 167, страница 6 из 7
Грамотная архитектура приложения на ASP.NET MVC
    #38326116
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAМСУ, ты сам начал с фразы: "Бред сивой кобылы". Вот он тебе той же монетой и ответил.
Я объяснил, почему эти дженерик сервисы и репозитории идут лесом.

hVosttМСУ, я по теме сказал очень много. если ты слепой, то тут уже ничем не поможешь. а твой репозиторий «в реалиях» мы так и не увидели. как я и предполагал, ты только языком ворочать можешь.
Ты по теме промычал что-то невнятное про обобщенный слой. Я тебе сказал, что это годится только для детского сада. Что мне тебе еще нужно показывать?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326146
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

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

если что, то дженерики подходят к репо на все 100%, таким образом в самом обобщенном случае реализацией репы может выступать даже обычный List<T>, что крайне хорошо для тестирования, таким образом логика не размазывается и каждый класс совершенно точно знает с чем работает, и выполняет сугубо свою задача, на залезая не на чьё поле.

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

посему, пропихивать говнокодинг, МСУ, не надо. или приводи пример, подтверждающий свои слова, или иди лесом, пока все твои слова высер умственно отсталого, который ляпает сам не зная чего. примеры давай. ссылки, пруфы, шо там у тебя есть за пазухай. или не умничай.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326206
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Репозиторий.

Ссылка была уже приведена, но я повторю: http://design-pattern.ru/patterns/repository.html

Цитата:

Паттерн Repository посредничает между слоем области определения и слоем распределения данных, работая, как обычная колекция объектов области определения.

и оно понятно, сам термин Repository переводится, как «хранилище»

Почему здесь уместны generics? Давайте посмотрим типичное переопределения DataContext:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
	internal class DataContext : DbContext
	{
		public DataContext()
			: base("DefaultConnection")
		{ }

		public DataContext(string connectionName)
			: base(connectionName)
		{ }

		...

		public DbSet<Customer> Customers { get; set; }
		public DbSet<Order> Orders { get; set; }

		...
	}



В данном случае каждый DbSet<T> является репозиторием отдельной сущности. Если T имеет навигационные свойства, то через полученный объект/коллекцию, можно получить доступ к связанным объектам. Поэтому каждому отдельному репозиторию нет нужды предоставлять доп. набор методов для связанных сущностей. Правда и здесь не все так идеально, как хотелось бы. Remove() выполненный для коллекции навигационного свойства не является равнозначной инструкцией Remove() репозитория (объект не удаляется, а лишь уничтожается связь). Что логично, в принципе.

Для учебных примеров вроде сойдёт. Но теперь к боевым «реалиям».

Определяем интерфейс:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	public interface IRepository<T> 
		where T: class
	{
		int Count();
		T Get(int id);
		T Add(T entity);
		T Update(T entity);
		T Remove(T entity);
		IQueryable<T> Query { get; }
	}



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

Реализация для EF:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
	internal class Repository<TEntity> : IRepository<TEntity>
		where TEntity : class
	{

		public Repository(DbContext dbContext)
		{
			_dbSet = dbContext.Set<TEntity>();
		}

		protected IDbSet<TEntity> DbSet
		{
			get { return _dbSet; }
		}

		public TEntity Get(int id)
		{
			return DbSet.Find(id);
		}

		public TEntity Add(TEntity entity)
		{
			DbSet.Add(entity);
			return entity;
		}

		public TEntity Remove(TEntity entity)
		{
			return DbSet.Remove(entity);
		}

		public TEntity Update(TEntity entity)
		{
			// nothing...
			return entity;
		}

		public IQueryable<TEntity> Query
		{
			get { return DbSet; }
		}
	}



Плюсов в таком подходе достаточно:
0. Самое главное! Тестирование! Очень легко генерить коллекции и подсовывать их как источник данных.
1. Реализацию полностью можно подменить на любую другую, сменив не только базу данных, провайдер, но и ORM.
2. В отдельных случаях можно подменить реализацию репы одной сущности на другую, допустим какие-нибудь сверхогромные блобы могут храниться совсем в другой базе данных. Или отдельные данные должны храниться в более защищенном хранилище (особенно учитывая некоторые пункты Кодекса по обработке персональных данных)...
3. Можно изготовить фабрику, которая будет выдавать репу для любой запрошенной сущности, и это легко реализовать.

Далее. Расширение.

Код: c#
1.
2.
3.
4.
	public interface IOrderRepository : IRepository<Order>
	{
		IQueryable<Order> VeryHeavyRecursiveQuery(params);
	}



Поясню, никто не запрещает расширять репу кастомными методами, для оптимизации тех же тяжелых запросов (для которых возможностей LINQ может не хватать), в том числе если надо избавиться в некоторых случаях от Lazy-поведения.

Репозиторий должен делать только то, что должен: «достижение полного разделения и односторонней зависимости между уровнями области определения и распределения данных» .

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

Пытаться пихнуть на репу каких-то еще задач, выйдет боком для сопровождения, развития и самое главное — для тестирования. Дженерики здесь очень даже уместны. Есть возражения? Примеры плз.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326212
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще одно уточнение.

Если какому-то сервису треба работать с несколькими сущностями, радя бога:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
internal class OrderService
{
   public OrderService(
      IOrderRepository orderRepository, 
      ICustomerRepository customerRepository, 
      Lazy<IChosenOneRepository> chosenOneRepository)
   {
       _orderRepository = orderRepository;
       _customerRepository = customerRepository;
       _chosenOneRepository = chosenOneRepository;
   }

   ...

}



Если конструктор получается перегружен кучей зависимостей, значит в дизайне творится какая-то каша и требуется срочный рефакторинг.

Для приложения не должен существовать какой-то мега-сервис, напичканный доступом ко всем данным. Ни в коем случае. Если такое имеет место быть, архитектура однозначно плохая и оправданий этому не может быть.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326310
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕсть возражения? Примеры плз.Да. Смотри первые две проблемы тут .
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326327
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

проблем не вижу.

хотите, используйте спецификации (я использую). не хотите, делайте «фабрику запросов».

специфика DAL не вылазит за пределы репы, если этого не сделать умышленно (всякие IsChanged инкапсулируются в прокси, и без специальных методов доступ к ним не получить).

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

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

про UnitOfWork я уже говорил. делаем IUnitOfWork и получаем его только там, где требуется изменение данных. в плюсах — если не видим у потребителя наличия IUnitOfWork, значит на все 100% знаем — данные он не изменяет. это неимоверный гуд.

репа и UnitOfWork не связаны вообще никак. заботиться об этом не нужно, если правильно употреблять IoC. никаких затрапезных студенческих поделок типа using(...) { }

итого: недостаток шаблона Repository только в его неправильном употреблении, и попытка сделать из него монстра с огромной кучей примитивных методов.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326329
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttпроблем не вижу.

хотите, используйте спецификации (я использую). не хотите, делайте «фабрику запросов».У тебя полтора человека в команде?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326341
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

вот об этом и речь :) я использую, но не пишу. четкое разделение ответственности в коде, позволяет организовать работу команды, понимать и использовать наработки друг друга. если писать единоличный проект, там можно творить все щто угодно.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326356
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttUpdate технически не нужен для работы с EF, но должен присутствовать и использоваться.
А почему не нужен? Как и где он реализуется?

ps
При работе с DbContext напрягает вся эта тема с Property.IsModified.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326363
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕсли конструктор получается перегружен кучей зависимостей, значит в дизайне творится какая-то каша и требуется срочный рефакторинг.

РБД это уже каша, которую таки придется расхлебывать. )
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326368
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон,

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

Update должен применяться, чтобы не зависеть от этого поведения.

если вы не хотите отслеживания (IsModified внутрях), можете получать объекты AsNoTracking().
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326393
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttесли вы не хотите отслеживания (IsModified внутрях), можете получать объекты AsNoTracking().
А если я не хочу получать объекты, а просто приаттачить по айди?
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326442
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон,

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

хотя приатачить таки можно. контекст это позволяет. но тогда будет дыра в абстракции.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326454
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt зачем атачить? там щто пару тыщей полей? расходы на эту операцию в масштабах приложения вообще не существенны, это не то, на чем стоило бы экономить.

Да полно операций, которые выполняют чисто апдейт, таблица на 40 - 50 полей (полно nvarchar), есть нагрузка. Мне каждый раз делать селект перед этим? )
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326461
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

нифига ты не понимаешь
репозитарий в твом примере один - dbcontext
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326472
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон,

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

если еще есть возможность проектировать/изменять схему данных, если полей так много стоит может задуматься уже и о нормировании :) видал я базы с таблицами over 200 полей. ниче так. я такие системы называю «системами поддержания работообеспечения персонала»
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326474
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRoshVostt,

нифига ты не понимаешь
репозитарий в твом примере один - dbcontext

если работать напрямую только с ним, то да.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326482
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

только с ним и работаешь как токо начинается транзакция
так что все остальное нафиг не нужно
и не каждый dbcontext есть полноценный репозитарий (полноценный должен дать возможность зафиксировать любую транзакцию если нет конкурренции)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326483
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttПарамон,

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

если еще есть возможность проектировать/изменять схему данных, если полей так много стоит может задуматься уже и о нормировании :) видал я базы с таблицами over 200 полей. ниче так. я такие системы называю «системами поддержания работообеспечения персонала»

Да я вижу сколько систем ты видел если, предлогаешь два обращения вместо одного.
Выходит прийдется нарушать концепцию и размазывать логику, а? :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326490
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

ради бога. называйте что хотите, как хотите :)
получаете UoW, и работаете с ним. забываете о транзакциях и конкуренции.
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326493
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон,

ничего идеального не бывает :)
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326499
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRos,

ради бога. называйте что хотите, как хотите :)
получаете UoW, и работаете с ним. забываете о транзакциях и конкуренции.
когда получиш уов твой, то заранее надо знать а зафиксируется ли оно :)
а ты нифига не знаешь
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326503
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все эти пустые слова придумали дебилы
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326507
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

вернее слова то верные- а вот интерпетация - говно
...
Рейтинг: 0 / 0
Грамотная архитектура приложения на ASP.NET MVC
    #38326510
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosкогда получиш уов твой, то заранее надо знать а зафиксируется ли оно :)
а ты нифига не знаешь

если не получу исключения, начит все зафиксировалось. может стоит еще манетку подбрасывать и гадать на луже?
...
Рейтинг: 0 / 0
25 сообщений из 167, страница 6 из 7
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Грамотная архитектура приложения на ASP.NET MVC
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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