Dra*_*821 5 structuremap datacontext asp.net-mvc caching linq-to-sql
我将首先告诉我的项目设置:
我在这里创建了一个bootstrapper类:
Imports StructureMap
Imports DCS.Data
Imports DCS.Services
Public Class BootStrapper
Public Shared Sub ConfigureStructureMap()
ObjectFactory.Initialize(AddressOf StructureMapRegistry)
End Sub
Private Shared Sub StructureMapRegistry(ByVal x As IInitializationExpression)
x.AddRegistry(New MainRegistry())
x.AddRegistry(New DataRegistry())
x.AddRegistry(New ServiceRegistry())
x.Scan(AddressOf StructureMapScanner)
End Sub
Private Shared Sub StructureMapScanner(ByVal scanner As StructureMap.Graph.IAssemblyScanner)
scanner.Assembly("DCS")
scanner.Assembly("DCS.Data")
scanner.Assembly("DCS.Services")
scanner.WithDefaultConventions()
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
我在这里创建了一个控制器工厂:
Imports System.Web.Mvc
Imports StructureMap
Public Class StructureMapControllerFactory
Inherits DefaultControllerFactory
Protected Overrides Function GetControllerInstance(ByVal controllerType As System.Type) As System.Web.Mvc.IController
Return ObjectFactory.GetInstance(controllerType)
End Function
End Class
Run Code Online (Sandbox Code Playgroud)
我修改了Global.asax.vb,如下所示:
...
Sub Application_Start()
RegisterRoutes(RouteTable.Routes)
'StructureMap
BootStrapper.ConfigureStructureMap()
ControllerBuilder.Current.SetControllerFactory(New StructureMapControllerFactory())
End Sub
...
Run Code Online (Sandbox Code Playgroud)
我已经为我的三个项目中的每一个添加了一个Structure Map注册表文件:DCS,DCS.Data和DCS.Services.这是DCS.Data注册表:
Imports StructureMap.Configuration.DSL
Public Class DataRegistry
Inherits Registry
Public Sub New()
'Data Connections.
[For](Of DCSDataContext)() _
.HybridHttpOrThreadLocalScoped _
.Use(New DCSDataContext())
'Repositories.
[For](Of IShiftRepository)() _
.Use(Of ShiftRepository)()
[For](Of IMachineRepository)() _
.Use(Of MachineRepository)()
[For](Of IShiftSummaryRepository)() _
.Use(Of ShiftSummaryRepository)()
[For](Of IOperatorRepository)() _
.Use(Of OperatorRepository)()
[For](Of IShiftSummaryJobRepository)() _
.Use(Of ShiftSummaryJobRepository)()
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
就加载dependecies而言,一切都很好,但是我遇到了Linq2SQL Classes生成的DCSDataContext类的问题.
我有一个表单发布到详细信息页面(/ Summary/Details),它从SQL加载一些数据.然后我有一个按钮,在JQuery中打开一个对话框,它将对话框从请求填充到(/ Operator/Modify).在对话框中,表单有一个组合框和一个OK按钮,允许用户更改操作员的名称.单击"确定"后,表单将发布到(/ Operator/Modify)并通过程序的服务和存储库层发送,并更新数据库中的记录.然后,调用RedirectToAction将用户发送回详细信息页面(/ Summary/Details),在那里调用再次从SQL中提取数据,更新详细信息视图.
一切都很好,除了详细信息视图没有显示所选的新运算符.我可以单步执行代码并查看正在访问的DCSDataContext类以更新操作符(实际上确实更改了数据库记录),但是当访问DCSDataContext以重新加载详细信息对象时,它会提取旧值.我猜测StructureMap不仅会导致DCSDataContext类,还会导致数据被缓存?
我还尝试将以下内容添加到Global.asax中,但它最终导致程序崩溃,告诉我DCSDataContext已被处理...
Private Sub MvcApplication_EndRequest(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.EndRequest
StructureMap.ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects()
End Sub
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
得到了来自Jeremy Miller对StructureMap谷歌小组的回复:
轻松赚钱,你在注册中创建了一个DataContext对象的实例 - 这实际上是整个StructureMap生态系统中的单例.
这段代码:
'Data Connections.
[For](Of DCSDataContext)() _
.HybridHttpOrThreadLocalScoped _
.Use(New DCSDataContext())
Run Code Online (Sandbox Code Playgroud)
需要使用-deferred-执行来定义DataContext,而不是使用预先构建的"New DCSDataContext()"
如果你在C#中(因为我不知道VB语法),你会这样做:
For<DCSDataContext>().HybridHttpOrThreadLocalScoped().Use(() => new DCSDataContext());
Run Code Online (Sandbox Code Playgroud)
我通过C#到VB转换器运行它,它给了我这个:
[For](Of DCSDataContext)() _
.HybridHttpOrThreadLocalScoped _
.Use(Function() New DCSDataContext())
Run Code Online (Sandbox Code Playgroud)
哪个效果很好!
| 归档时间: |
|
| 查看次数: |
1247 次 |
| 最近记录: |