【发布时间】:2011-11-18 08:54:26
【问题描述】:
我是 MVC、EF 等的新手,所以我按照 http://www.asp.net/mvc 的 MVC3 教程设置了一个应用程序(虽然还没有完成所有操作)。
到目前为止,这是我的应用程序的“架构”
GenericRepository-
PropertyRepository为“属性”实体继承GenericRepository -
HomeController有PropertyRepository作为成员。
例子:
public class HomeController
{
private readonly PropertyRepository _propertyRepository
= new PropertyRepository(new ConfigurationDbContext());
}
现在让我们考虑以下内容:
我的GenericRepository 中有一个方法需要相当长的时间,需要在一个事务中调用 6 个查询以保持完整性。我的谷歌结果 yeldet SaveChanges() 被视为一个事务 - 所以如果我对我的上下文进行多项更改然后调用 SaveChanges() 我可以“确定”这些更改在 SQL Server 上是“原子的” .对?错了吗?
此外,还有一个调用_propertyRepository.InvokeLongAndComplex() 方法的操作方法。
我刚刚发现:MVC 为每个请求创建一个新控制器。所以我最终得到了多个PropertyRepositories,这会破坏我的数据库完整性。 (我必须在数据库中维护一个我的属性的链接列表,如果用户移动一个属性,它需要 6 个步骤来相应地更改列表,但这样我可以避免在拥有数千个实体时循环遍历所有实体......)
我想将我的GenericRepository 和PropertyRepository 设为静态,因此每个HomeController 都使用相同的存储库并同步InvokeLongAndComplex 方法以确保一次只有一个线程对数据库进行更改.
我怀疑这个想法不是一个好的解决方案,但我找不到适合这个问题的解决方案 - 有些人说拥有静态存储库是可以的(但是上下文会发生什么?)。其他一些人说使用 IOC/DI(?),这听起来需要做很多工作(甚至不确定这是否能解决我的问题......)但似乎我可以“告诉”容器始终“注入” " 相同的上下文对象,相同的存储库,然后同步 InvokeLongAndComplex() 方法就足够了,不会让多个线程破坏完整性。
Why aren't data repositories static? 答案2:
2) 您通常希望每个请求拥有 1 个存储库实例,以便更轻松地确保来自一个用户的未提交更改不会对另一个用户造成混乱。
为什么每个请求都有一个存储库实例不会再次弄乱我的链接列表?
谁能给我一个建议或分享我可以遵循的最佳实践?
【问题讨论】:
标签: asp.net-mvc-3 architecture entity-framework-4.1 software-design