Я начну рассказывать мои настройки проекта:Использование 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
Может кто-то пожалуйста, помогите?
Как мне задать параметр() => новый DCSDataContext (параметр), я хочу, чтобы создание paramater было подключено автоматически, я не хочу создавать и давать вручную –
@Sessiz Satt: Я сделал это со строкой подключения имущество. Я вытащил свое свойство строки подключения из файла Web.Config и передал его так:() => новый DCSDataContext (ConfigurationManager.AppSettings ["Key"]) – Dragn1821