Используя ASP.NET MVC, Linq К SQL и порождение StructureMap DataContext к данным кэша

Я запущу путем сообщения моей установки проекта:

  • 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
...

Я добавил файл реестра Карты Структуры к каждому из моих трех проектов: 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

Кто-то может помочь?

5
задан Dragn1821 25 March 2010 в 18:57
поделиться

1 ответ

Получил ответ от Джереми Миллера в группе 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())

Что отлично работает!

5
ответ дан 14 December 2019 в 19:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: