【发布时间】:2011-10-07 22:17:06
【问题描述】:
这显然是一个已经讨论过很多次的话题,但是我在这里的处理角度有点不同。据我了解,STE 被认为是 POCO(它不以任何方式与 EF dll 绑定),它只是在其中包含一些额外的“东西”,用于处理自己的更改跟踪。假设有以下应用层:
Proj.Web
Proj.Business
Proj.Model
Proj.DataAccess
假设 lazy loading 不是必需的,并且我们在 2 层设置中运行,我的理解是使用 STE 和 POCO 之间确实没有区别。由于我们在 Web 上并且它是一个断开连接的环境,因此选择将是对 Postback 的附加 SQL 查询,或者必须附加实体并将属性设置为根据需要进行修改。再次(如果我错了,请纠正我)代码看起来相同。
让我们考虑一个简单的例子,我们正在处理 webform 应用程序中的回发:
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();
假设稍后我们被要求将架构提升到 3 层,在 Proj.Bussiness 和 Proj.Web 之间引入 WCF 传输层,我们称之为 Proj.Services。如果我们一开始就使用 STE,我们不是处于一个更好的位置吗?我们所要做的就是将调用转发到业务层,而无需以任何方式修改它或存储库:
PersonService.Update(Person p)
{
PersonManager.Update(p);
}
例如,如果我们使用 POCO(让我们假设快照),我们必须以一种必须检查该实体是否已经存在于上下文中的方式进行编码(如果我们正在运行 2 层)以及是否不是(3 层)附加它并将其属性设置为已修改。当您不确定将来是否需要 3 层解决方案时,似乎需要做更多的工作。另一方面,如果您一直都在针对 STE 进行编码,那么您将添加的唯一额外不必要的(实际上并没有损害任何东西)代码是对 ApplyChanges() 的调用。否则,我认为您不会丢失任何东西(再次假设不需要延迟加载)。你对这个话题有什么看法?
【问题讨论】:
-
可能是洋葱架构?是的,你真的不需要规划 3 层架构,但对我来说感觉更自然。不是 3 层应用程序 Ui 层,业务逻辑 - 任何人都可以更新数据吗?权限?多米安模型?那么你有数据访问的持久性......或者我的理解很好,请纠正我......
-
@Haroon,你所说的3层实际上是3层(逻辑),但可以在2层(物理)中运行。我不确定我是否了解您的其他问题。
-
@e36M3 - 可悲的是,“Tier”这个词在当今的行业中已经失去了所有意义,试图收回它的真正目的是没有希望的。出于所有意图和目的,如今一个层就是一个层。
-
@Mystere Man:只是因为有太多的开发人员不了解其中的区别。即使在现在,区分层和层 - 逻辑和物理边界也非常重要。
-
@Ladislav Mrnka - 不仅仅是开发人员.. 书籍甚至会犯这个错误。我试图与其他开发人员和经理争论这一点,他们就是不明白。几乎没有人知道真实的事情,所以这是一个徒劳的立场。接受它并打一场你能赢得的战斗。这就像试图说服人们在数据库中使用自然键而不是在所有内容上猛击身份列。
标签: .net asp.net entity-framework entity-framework-4 self-tracking-entities