2011-06-20 24 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();