使用 AutoFac 和 MVC3 的 ObjectContext 的行为
我使用 AutoFac 作为 IoC 将 ObjectContext 注入需要它的控制器中。
ObjectContext 使用 InstancePerLifetimeScope 在 AutoFac 中注册,并且我创建了一个自定义控制器工厂,它可以从 DI 容器解析正确的控制器,从而注入 ObjectContext。
当我请求页面时,一切看起来都很好,并且按预期使用 EF4 从数据库中获取数据。
我想知道的行为是,在启动 Web 应用程序后,我手动从数据库中删除或添加一些条目,这些更改不会反映在我的 Web 应用程序中。我数据库中有 10 条记录,删除了 5 条,但 EF 仍然获取了所有 10 条记录。我认为当我使用 InstancePerLifetimeScope 在 AutoFac 中注册 ObjectContext 时,这意味着每个 Web 请求都会创建一个新的 ObjectContext。
现在看来,如果我没有误解有关 EF 缓存方式的某些内容,则似乎始终使用相同的 ObjectContext。
除了看不到我从其他应用程序对数据库所做的更改之外,我想当连接到该站点的所有用户都使用相同的 ObjectContext 时,这会在生产中导致问题,因为 ObjectContext 不是线程安全的。
有人知道我哪里错了吗?
I am using AutoFac as a IoC to inject the ObjectContext inside the Controllers that needs it.
The ObjectContext is registered in AutoFac using InstancePerLifetimeScope
, and I have created a custom Controller factory that resolves the correct controller from the DI-container, and thereby gets the ObjectContext injected.
When I request a page, everything looks fine, and the data is fetched from the database using EF4 as expected.
The behavious I am wondering about is that after I have started up the web application, and I go to delete or add some entries from the database manually, those changes are not reflected inside my web app. I had 10 records in the database, deleted 5, but still all 10 records are fetched by EF. I thought that when I registered the ObjectContext in AutoFac with InstancePerLifetimeScope
that meant a new ObjectContext got created per web request.
Now it seems that the same ObjectContext is used at all times, if I have not misunderstood something about how EF caches.
In addition to not seeing the changes I make to the database from other applications, I guess this will cause problems in production when all users that connect to the site uses the same ObjectContext, since the ObjectContext is not threadsafe.
Anyone knows where I went wrong here?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我猜你的自定义
IControllerFactory
有问题。如果您使用最新的 Autofac/MVC 集成,请使用 AutofacDependencyResolver 而不是控制器工厂。如果使用较旧的 Autofac/MVC,请使用提供的控制器工厂,并确保在 Autofac wiki 上描述的
ContainerDisposalModule
在Web.config
中正确设置。I would guess that your custom
IControllerFactory
is at fault. If you're using the latest Autofac/MVC integration, useAutofacDependencyResolver
rather than a controller factory.If using an older Autofac/MVC, use the provided controller factory and make sure the
ContainerDisposalModule
described on the Autofac wiki is correctly set up inWeb.config
.你应该这样配置
You should configure it like this
据我了解,在 AutoFac 中,您可以使用生命周期范围作为缺少的 Web 请求上下文 生活方式的替代方案:在每个 Web 请求开始时创建一个新的生命周期范围并使用它来解析组件。然后在请求结束时处置范围。
所以我的猜测是你不应该在请求结束时处置你的范围?
From what I understand, in AutoFac you can use lifetime scopes as an alternative to the missing Web Request Context lifestyle: create a new lifetime scope at the beginning of each web request and use it to resolve components. Then dispose of the scope when the request ends.
So my guess is that you should not dispose your scope at the end of the request ?