2010-03-25 17 views
5

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?

Respuesta

5

Tienes esta respuesta de vuelta de Jeremy Miller en el grupo StructureMap Google:

El dinero fácil, va a crear una instancia de su objeto DataContext -yourself- en el registro, lo que hace de facto que un producto único en todo el ecosistema StructureMap.

este código:

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

necesita definir el DataContext mediante la ejecución -deferred- lugar de utilizar el pre-construidos "Nueva DCSDataContext()"

Si se va en C# (porque no conozco la sintaxis de VB), lo haría:

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

Me corrió a través de una C# convertidor VB y me dio esto:

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

Qué funciona muy bien!

+0

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 –

+0

@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

Cuestiones relacionadas