.net 使用AutoFac和MVC3的ObjectContext行为

.net 使用AutoFac和MVC3的ObjectContext行为,.net,asp.net-mvc-3,entity-framework-4,autofac,.net,Asp.net Mvc 3,Entity Framework 4,Autofac,我使用AutoFac作为IoC,将ObjectContext注入到需要它的控制器中 ObjectContext是使用InstancePerLifetimeScope在AutoFac中注册的,我创建了一个自定义控制器工厂,该工厂从DI容器解析正确的控制器,从而注入ObjectContext 当我请求一个页面时,一切看起来都很好,数据按预期使用EF4从数据库中获取 我想知道的是,在启动web应用程序之后,我手动从数据库中删除或添加一些条目,这些更改不会反映在我的web应用程序中。我在数据库中有10条

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

ObjectContext是使用
InstancePerLifetimeScope
在AutoFac中注册的,我创建了一个自定义控制器工厂,该工厂从DI容器解析正确的控制器,从而注入ObjectContext

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

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

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

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


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

据我所知,在AutoFac中,您可以使用生存期作用域作为缺少的Web请求上下文的替代方式:在每个Web请求的开头创建一个新的生存期作用域,并使用它来解析组件。然后在请求结束时处置作用域


所以我的猜测是,您不应该在请求结束时处理您的作用域?

您应该这样配置它

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

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

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