使用AutoFac和MVC3的ObjectContext行为

时间:2011-06-20 08:01:00

标签: .net asp.net-mvc-3 entity-framework-4 autofac

我使用AutoFac作为IoC,将ObjectContext注入需要它的控制器中。

ObjectContext使用InstancePerLifetimeScope在AutoFac中注册,我创建了一个自定义Controller工厂,它可以从DI容器中解析出正确的控制器,从而获得ObjectContext注入。

当我请求页面时,一切看起来都很好,并且按照预期使用EF4从数据库中提取数据。

我想知道的是,在我启动Web应用程序之后,我会手动删除或从数据库中添加一些条目,这些更改不会反映在我的Web应用程序中。我在数据库中有10条记录,删除了5条记录,但EF仍然提取了所有10条记录。我认为当我在AutoFac中使用InstancePerLifetimeScope注册ObjectContext时,意味着每个Web请求都创建了一个新的ObjectContext。

现在似乎总是使用相同的ObjectContext,如果我没有误解EF如何缓存。

除了没有看到我从其他应用程序对数据库所做的更改之外,我想当连接到该站点的所有用户使用相同的ObjectContext时,这将导致生产中的问题,因为ObjectContext不是线程安全的。

有人知道我在哪里错了吗?

3 个答案:

答案 0 :(得分:2)

我猜你的自定义IControllerFactory有错。如果您正在使用最新的Autofac / MVC集成,请使用AutofacDependencyResolver而不是控制器工厂。

如果使用较旧的Autofac / MVC,请使用提供的控制器工厂,并确保在ContainerDisposalModule中正确设置了Autofac wiki上描述的Web.config

答案 1 :(得分:1)

您应该像这样配置

builder.RegisterType<MyContext>().As<IDataContext>().AsSelf()
    .InstancePerHttpRequest();

答案 2 :(得分:0)

根据我的理解,在AutoFac中,您可以使用生命周期范围作为缺少 Web请求上下文生活方式的替代方法:在每个Web请求开始时创建新的生命周期范围并使用它来解析组件。然后在请求结束时处置范围

所以我的猜测是你不应该在请求结束时处理你的范围?