我正在尝试学习实体框架和相关模式。在搜索时我遇到了网站:http://www.asp.net/mvc...
我检查了模式,但我无法理解一点。根据我的调查,dbcontex的生命周期应该很少,因为它具有内存中的对象模型,并且这些更改应该尽可能快地保存到数据库中。如果不是,则在多用户场景中将存在冲突。
当我查看上面的教程时,我看到每个控制器只定义了一个uow。我想知道这是否意味着只要我在网站的一页上进行CRUD操作我就使用相同的dbcontext。但它的寿命不应该缩短吗?例如,对于每个动作,可以定义一个uow。
有人可以解释一下你的生命吗?
答案 0 :(得分:2)
每个被调用的动作都是控制器的新实例。只需在控制器构造函数中设置一个断点,您就会看到每次向控制器上的任何操作发出请求时都会调用它。
通常,DBContext的范围是Web应用程序中的每个Web请求。因此,如果您将DBContext注入控制器,通常会为您提供所需的内容。
答案 1 :(得分:2)
将DbContext
定义为私有类变量而不是将其定义为局部变量不应该有任何区别。
每次创建HTTP请求时,都会初始化控制器(以及它的任何类变量)并调用该操作。控制器的实例不会在不同的请求之间持续存在,DbContext
的任何实例也不会存在。
查看有关why you don't have to worry about the lifetime of a DbContext的文章。
在我发布这个答案后的几天,我意识到这个答案的一个警告,如果我没有更新它,我会感到内疚。
如果每个操作都使用您的DbContext
,则上述声明为真。但是,如果只有少数操作使用它,那么最好使用本地范围的DbContext
。这可以防止在您调用不需要使用它的操作时不必要地创建DbContext
类变量。这会让你的代码更有效吗?是的 - 但是微不足道 - 并且每次你想要使用它时你都必须实例化一个DbContext
,这将导致稍微混乱的代码,而不仅仅是一个类变量在顶部。
答案 2 :(得分:1)
在给出的示例中,控制器负责创建DbContext的实例并执行dispose。更好的做法是让IoC容器负责DbContext实例的生命周期控制,并实现构造函数注入以将DbContext注入MVC / WebApi控制器。
对于WCF服务,我的首选是指出以下属性 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 对于服务,还指定DbContext的生命周期,以便每次调用只创建一个DbContext实例。
如果要为WCF服务或MVC / WebApi实施DI,则可能需要进行一些生命周期管理。 参考:http://www.stagexl.org/docs/wiki-articles.html?article=graphics
此帖也强烈推荐您的问题。 https://msdn.microsoft.com/en-us/library/dn178463(v=pandp.30).aspx#_Lifetime_Management