2010-03-25 1 views
5

Я начну рассказывать мои настройки проекта:Использование ASP.NET MVC, LINQ To SQL, и StructureMap вызывая DataContext для кэширования данных

  • ASP.NET MVC 1,0
  • StructureMap 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 

Я модифицировал 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

Получил этот ответ назад от Джереми Миллер на StructureMap группы Google

Легкие деньги, вы создаете экземпляр вашего объекта DataContext -yourself- в регистрации, что де-факто делает что одноэлементно во всем экосистему StructureMap.

Этот код:

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

потребность определить DataContext с помощью -deferred- исполнения, а не с помощью предварительно построенного "Нового DCSDataContext()"

Если бы вы были в C# (потому что я не знаю синтаксиса VB), вы бы сделали:

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

Я побежал это через C# на VB конвертер и он дал мне это:

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

Который работает отлично!

+0

Как мне задать параметр() => новый DCSDataContext (параметр), я хочу, чтобы создание paramater было подключено автоматически, я не хочу создавать и давать вручную –

+0

@Sessiz Satt: Я сделал это со строкой подключения имущество. Я вытащил свое свойство строки подключения из файла Web.Config и передал его так:() => новый DCSDataContext (ConfigurationManager.AppSettings ["Key"]) – Dragn1821

Смежные вопросы