【发布时间】:2012-03-09 00:22:12
【问题描述】:
我有两个 jqGrid,它们通过 ajax POST 调用向我的控制器加载数据,每次运行应用程序时,两个 POST 中只有一个成功执行。通常,如果我在浏览器上点击刷新,两个网格都会正确加载。但始终有 1 个在每个视图的第一次加载时失败(我有两个视图/页面,每个视图/页面都有 2 个 jqGrid,“仪表板样式”)。在 log4net 日志中,这两个请求具有不同的线程,一个总是失败,而另一个成功,但哪个成功是随机的(可能是先到先得)......有时我在尝试迭代时遇到空引用错误结果可枚举的项目列表,其他时候我得到“连接没有关闭。连接的当前状态是正在连接。”
我怀疑这可能是什么原因:启用了 EF 延迟加载/代理、错误的 Windsor 配置、未抛出或显示在堆栈跟踪中的自动映射器错误。但由于我真的不知道,下面是我的设置,以防它有助于破译这个。
持久性 [LifestyleSingleton] - 保存 EF4 数据上下文(代码优先)和对 EF4.3 的引用。有一个工厂用于创建名为 GetContext() 的上下文,该工厂实现了 IDisposable。
Repo [LifestylePerWebRequest] - 它包含实现存储库和规范模式的存储库 (http://huyrua.wordpress。 com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/)。
服务 [LifestylePerWebRequest] - 调用 repo 并应用总线逻辑,即返回 PagedList 对象以进行 UI 分页。
Controllers [LifestyleTransient] - mvc 控制器,利用 automapper 映射到视图模型类型。
MVC UI - I我正在实现 Lib.Web.MVC,它为 jqGrid 创建了一个强类型的包装器。从这里开始,我使用 Windsor 容器进行 DI。
更新:我更改了所有组件以向 LifestylePerThread 注册,并且所有错误似乎都已解决。但是,我不明白为什么..我是 DI 的新手,所以我确定我错过了一些东西。 有人能解释一下为什么这解决了这个问题吗? 就可扩展性而言,这种变化会起到什么作用......?我想我希望上下文工厂连同上下文本身一起注册为单例,但这显然是不正确的。
【问题讨论】:
标签: asp.net-mvc-3 entity-framework entity-framework-4 jqgrid castle-windsor