加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 使用ASP.NET MVC,Linq To SQL和StructureMap导致

发布时间:2020-12-16 06:57:12 所属栏目:asp.Net 来源:网络整理
导读:我将首先告诉我的项目设置: ASP.NET MVC 1.0 StructureMap 2.6.1 VB 我在这里创建了一个bootstrapper类: Imports StructureMapImports DCS.DataImports DCS.ServicesPublic Class BootStrapper Public Shared Sub ConfigureStructureMap() ObjectFactory.I
我将首先告诉我的项目设置:

> ASP.NET MVC 1.0
> StructureMap 2.6.1
> VB

我在这里创建了一个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

我在这里创建了一个控制器工厂:

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

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

...
    Sub Application_Start()

        RegisterRoutes(RouteTable.Routes)

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

    End Sub
...

我已经为我的三个项目中的每一个添加了一个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

就加载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

有人可以帮忙吗?

解决方法

得到了来自Jeremy Miller对StructureMap谷歌小组的回复:

轻松赚钱,你在注册中创建了一个DataContext对象的实例 – 这实际上是整个StructureMap生态系统中的单例.

这段代码:

'Data Connections. 
[For](Of DCSDataContext)() _ 
    .HybridHttpOrThreadLocalScoped _ 
    .Use(New DCSDataContext())

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

如果你在C#中(因为我不知道VB语法),你会这样做:

For<DCSDataContext>().HybridHttpOrThreadLocalScoped().Use(() => new DCSDataContext());

我通过C#到VB转换器运行它,它给了我这个:

[For](Of DCSDataContext)() _
    .HybridHttpOrThreadLocalScoped _
    .Use(Function() New DCSDataContext())

哪个效果很好!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读