Я запущу путем сообщения моей установки проекта:
Я создал 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
...
Я добавил файл реестра Карты Структуры к каждому из моих трех проектов: 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, но у меня есть проблемы с классом DCSDataContext, который был genereated Классами Linq2SQL.
У меня есть форма, которая отправляет на страницу деталей (/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
Кто-то может помочь?
Получил ответ от Джереми Миллера в группе Google StructureMap:
Легкие деньги, вы создаете экземпляр своего объекта DataContext -yourself- при регистрации, который де-факто делает это единичным экземпляром для всей экосистемы StructureMap.
Этот код:
'Data Connections.
[For](Of DCSDataContext)() _
.HybridHttpOrThreadLocalScoped _
.Use(New DCSDataContext())
Требуется определить DataContext с использованием -deferred- execution вместо использования предварительно созданного «New DCSDataContext ()»
Если бы вы использовали C # (потому что я не знаю синтаксиса VB ), вы бы сделали:
For<DCSDataContext>().HybridHttpOrThreadLocalScoped().Use(() => new DCSDataContext());
Я пропустил это через конвертер C # в VB, и он дал мне следующее:
[For](Of DCSDataContext)() _
.HybridHttpOrThreadLocalScoped _
.Use(Function() New DCSDataContext())
Что отлично работает!