Это, очевидно, тема, которая обсуждалась много раз, однако мой угол подхода здесь немного другой. Насколько я понимаю, STE считается POCO (он никак не связан с EF dll), он просто содержит некоторые дополнительные «вещи» для обработки своего собственного отслеживания изменений. Предполагая следующие прикладные уровни:
Proj.Web
Proj.Business
Proj.Model
Proj.DataAccess
Предполагая, что lazy loading
не требуется, и мы работаем в двухуровневой установке, я понимаю, что между использованием STE и POCO не будет никакой разницы. Поскольку мы находимся в Интернете, и это автономная среда, в качестве альтернативы можно выбрать дополнительный SQL-запрос к Postback
или необходимость присоединить сущность и изменить свойства по мере необходимости. Снова (поправьте меня, если я ошибаюсь) код будет выглядеть идентично.
Давайте рассмотрим простой пример, мы обрабатываем обратную передачу в приложении веб-формы:
Person p = PersonManager.GetById(2); //we use the "requery" method
PersonManager.Update(p);
//If we dig into PersonManager.Update() we'll see the following:
PersonRepository.ApplyChanges(p); //we're assuming STEs are used so this API is available
PersonRepository.SaveChanges();
Предполагая, что позже нас попросят перевести архитектуру на трехуровневый, внедрив транспортный уровень WCF между Proj.Bussiness и Proj.Web, давайте назовем его Proj.Services. Если бы мы использовали STE для начала, разве мы не в лучшем положении? Все, что нам нужно сделать, это перенаправить вызовы на бизнес-уровень, без необходимости изменять его или репозитории любым способом:
PersonService.Update(Person p)
{
PersonManager.Update(p);
}
Если, например, мы использовали POCO (давайте предположим моментальный снимок), мы должны были бы кодировать таким образом, чтобы проверять, существует ли эта сущность в контексте (если мы запускаем 2-уровневый), и если не (3-х уровневый) прикрепите его и измените его свойства. Похоже, гораздо больше работы, когда вы не уверены, понадобится ли в будущем 3-уровневое решение. С другой стороны, если бы вы все время кодировали против STE, то единственный лишний (который на самом деле ничего не вредит) код, который вы бы вставили, - это вызов ApplyChanges (). В противном случае я не думаю, что вы что-то теряете (опять же, если ленивая загрузка не требуется). Что ты думаешь по этому поводу?