我使用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不是线程安全的。
有人知道我在哪里错了吗?
答案 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请求开始时创建新的生命周期范围并使用它来解析组件。然后在请求结束时处置范围。
所以我的猜测是你不应该在请求结束时处理你的范围?