Empezaré diciendo que mi configuración del proyecto:mediante ASP.NET MVC, LINQ to SQL y StructureMap causando DataContext a datos de la caché
- ASP.NET MVC 1.0
- StructureMap 2.6.1
- VB
he creado una clase de programa previo se muestra aquí:
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
He creado una fábrica de controlador que se muestra aquí:
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
He modificado el Global.asax.vb como se muestra aquí:
...
Sub Application_Start()
RegisterRoutes(RouteTable.Routes)
'StructureMap
BootStrapper.ConfigureStructureMap()
ControllerBuilder.Current.SetControllerFactory(New StructureMapControllerFactory())
End Sub
...
He añadido un archivo de registro para estructura del mapa cada uno de mis tres proyectos: DCS, DCS.Data y DCS.Services. Aquí está el registro 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
Todo funciona muy bien en cuanto a la carga de los dependecies, pero estoy teniendo problemas con la clase DCSDataContext que fue genereated por clases Linq2Sql.
que tienen una forma que los mensajes a una página de detalles (/ Resumen/Datos), que carga en algunos datos de SQL. Luego tengo un botón que abre un cuadro de diálogo en JQuery, que rellena el diálogo de una solicitud a (/ Operador/Modificar). En el cuadro de diálogo, el formulario tiene un cuadro combinado y un botón Aceptar que permite al usuario cambiar el nombre del operador. Al hacer clic en Aceptar, el formulario se publica en (/ Operador/Modificar) y se envía a través de las capas de servicio y repositorio de mi programa y actualiza el registro en la base de datos. A continuación, se llama a RedirectToAction para enviar de nuevo al usuario a la página de detalles (/ Resumen/Detalles) donde hay una llamada para volver a extraer los datos de SQL, actualizando la vista de detalles.
Todo funciona muy bien, excepto la vista de detalles no muestra el nuevo operador que se seleccionó. Puedo recorrer el código y ver está accediendo a la clase DCSDataContext para actualizar el operador (que cambia realmente el registro de base de datos), pero cuando se accede al DCSDataContext para recargar los datos de objetos, se tira en el valor antiguo. Supongo que StructureMap está causando no solo la clase DCSDataContext, sino también los datos que se almacenarán en caché.
También he intentado añadir lo siguiente a la Global.asax, pero simplemente termina por estrellarse el programa me dice la DCSDataContext se ha dispuesto ...
Private Sub MvcApplication_EndRequest(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.EndRequest
StructureMap.ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects()
End Sub
Por favor alguien puede ayudar?
Cómo doy el parámetro a() => nuevo DCSDataContext (parámetro), quiero que la creación del parámetro esté autoalambrada, no quiero crear y dar manualmente –
@Sessiz Satt: Lo hice con la cadena de conexión propiedad. Quité la propiedad de la cadena de conexión del archivo Web.Config y la pasé así ...() => new DCSDataContext (ConfigurationManager.AppSettings ["Key"]) – Dragn1821