2011-06-20 20 views
1

我使用AutoFac作为IoC在需要它的控制器内部注入ObjectContext。使用AutoFac和MVC3的ObjectContext行为

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

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

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

现在看来,如果我没有误解EF如何缓存某些内容,那么在任何时候都会使用相同的ObjectContext。

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

任何人都知道我在哪里出错了吗?

回答

2

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

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

+0

这似乎是在做伎俩:)非常感谢。 –

0

据我了解,在AutoFac你可以使用一生范围,以替代缺失的的Web请求上下文生活方式:在创建每个Web请求开始一个新的生命周期范围,并用它来解决组件。然后处理请求结束时的范围

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

1

你应该这样

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