asp.net-mvc – 使用ASP.NET MVC,Linq To SQL和StructureMap导致
我将首先告诉我的项目设置:
> ASP.NET MVC 1.0 我在这里创建了一个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()) 哪个效果很好! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET智能感知与客户端属性
- ASP.NET 站点地图的使用
- asp.net-mvc – ActionLink后退按钮
- ASP.NET Core的JWT的实现(自定义策略形式验证).md
- asp.net-mvc – Razor视图引擎.cshtml页面中的OutputCache
- 具有任意数量的键值对的ASP.NET路由 – 是否可能?
- .NET授权.订单或允许和拒绝元素是否重要?
- asp.net-mvc-3 – @ Html.ActionLink和@ Html.DisplayFor同
- asp.net-mvc – ViewBag和ViewData也是asp.net mvc中状态管
- 实体框架 – 实体框架生成的类不在我需要的命名空间中,是否