Asp.net mvc 使用ASP.NET MVC、Linq To SQL和StructureMap使DataContext缓存数据

Asp.net mvc 使用ASP.NET MVC、Linq To SQL和StructureMap使DataContext缓存数据,asp.net-mvc,linq-to-sql,caching,structuremap,datacontext,Asp.net Mvc,Linq To Sql,Caching,Structuremap,Datacontext,我将首先告诉我的项目设置: ASP.NET MVC 1.0 结构图2.6.1 VB 我创建了一个引导程序类,如下所示: Imports StructureMap Imports DCS.Data Imports DCS.Services Public Class BootStrapper Public Shared Sub ConfigureStructureMap() ObjectFactory.Initialize(AddressOf StructureMa

我将首先告诉我的项目设置:

  • ASP.NET MVC 1.0
  • 结构图2.6.1
  • VB
我创建了一个引导程序类,如下所示:

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
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
...
    Sub Application_Start()

        RegisterRoutes(RouteTable.Routes)

        'StructureMap
        BootStrapper.ConfigureStructureMap()
        ControllerBuilder.Current.SetControllerFactory(New StructureMapControllerFactory())

    End Sub
...
我创建了一个控制器工厂,如下所示:

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
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
...
    Sub Application_Start()

        RegisterRoutes(RouteTable.Routes)

        'StructureMap
        BootStrapper.ConfigureStructureMap()
        ControllerBuilder.Current.SetControllerFactory(New StructureMapControllerFactory())

    End Sub
...
我修改了Global.asax.vb,如下所示:

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
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
...
    Sub Application_Start()

        RegisterRoutes(RouteTable.Routes)

        'StructureMap
        BootStrapper.ConfigureStructureMap()
        ControllerBuilder.Current.SetControllerFactory(New StructureMapControllerFactory())

    End Sub
...
我在三个项目中分别添加了一个结构映射注册表文件:DCS、DCS.Data和DCS.Services。这是DCS数据注册表:

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
就加载依赖项而言,一切都很好,但我对Linq2SQL类生成的DCSDataContext类有问题

我有一个表单可以发布到详细信息页面(/Summary/details),该页面从SQL加载一些数据。然后,我有一个按钮,可以在JQuery中打开一个对话框,它将对话框从请求填充到(/Operator/Modify)。在对话框中,表单有一个组合框和一个OK按钮,允许用户更改操作员的姓名。单击“确定”后,表单将发布到(/Operator/Modify),并通过我的程序的服务层和存储库层发送,并更新数据库中的记录。然后,调用RedirectToAction将用户发送回详细信息页面(/Summary/details),在该页面中,将再次调用从SQL提取数据,更新详细信息视图

除了“详细信息”视图不显示所选的新操作员外,其他操作都非常有效。我可以单步查看代码,并看到访问DCSDataContext类以更新操作符(这实际上更改了数据库记录),但当访问DCSDataContext以重新加载details对象时,它会拉入旧值。我猜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

有人能帮忙吗?

在StructureMap google group上得到Jeremy Miller的回复:

简单来说,您正在注册中创建DataContext对象的一个实例——您自己,这实际上使它成为整个StructureMap生态系统中的一个单例

此代码:

需要使用-deferred-execution定义DataContext,而不是使用预构建的“New DCSDataContext()”

如果您使用的是C#(因为我不知道VB语法),您将执行以下操作:


太棒了

如何将参数赋予()=>new DCSDataContext(参数),我希望参数的创建是自动连接的,我不希望创建并赋予manually@SessizSatt:我已经用连接字符串属性完成了这项工作。我从Web.Config文件中提取了我的连接字符串属性,并像这样传递它。。。()=>新的DCSDataContext(ConfigurationManager.AppSettings[“Key”])