Problema de aplicación StructureMap en VB.Net Conversión de SharpArchitecture
-
23-09-2019 - |
Pregunta
trabajo en un entorno de VB.Net y han sido recientemente la tarea de crear un entorno MVC para su uso como una base para trabajar. Decidí convertir la última versión SharpArchitecture (Q3 2009) en VB, que en general tiene bien se ha ido después de un poco de tirar del pelo. Me encontré con un problema con el castillo de Windsor, donde mi interfaz repositorio personalizado (residente en el proyecto de núcleo / dominio) que era referencia en el constructor de mi controlador de prueba no se iba a inyectar con la aplicación concreta (desde el proyecto de datos). Me golpeó una pared de ladrillos con este así que básicamente decidido cambiar a cabo el castillo de Windsor para StructureMap.
creo que he implementado este bien, ya que todo se compila y se ejecuta y mi controlador de RAN bien al hacer referencia a una interfaz de repositorio personalizado. Parece ahora que tengo / o no pueden ahora configurar mis interfaces genéricas correctamente (espero que esto tiene sentido por lo que yo soy nuevo en todo esto). Cuando uso IRepository (Of T) (querer que se inyecta con una aplicación concreta del Repositorio (de tipo)) en el constructor del controlador estoy recibiendo el siguiente error de ejecución:
"StructureMap Código de excepción: 202 Sin instancia predeterminada definida para PluginFamily SharpArch.Core.PersistenceSupport.IRepository`1 [[DebtRemedy.Core.Page, DebtRemedy.Core, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]], SharpArch.Core, versión = 1.0.0.0, Culture = neutral, PublicKeyToken = b5f559ae0ac4e006"
Aquí están mis fragmentos de código que estoy usando (mi proyecto se llama DebtRemedy).
Mi clase de registro StructureMap
Public Class DefaultRegistry
Inherits Registry
Public Sub New()
''//Generic Repositories
AddGenericRepositories()
''//Custom Repositories
AddCustomRepositories()
''//Application Services
AddApplicationServices()
''//Validator
[For](GetType(IValidator)).Use(GetType(Validator))
End Sub
Private Sub AddGenericRepositories()
''//ForRequestedType(GetType(IRepository(Of ))).TheDefaultIsConcreteType(GetType(Repository(Of )))
[For](GetType(IEntityDuplicateChecker)).Use(GetType(EntityDuplicateChecker))
[For](GetType(IRepository(Of ))).Use(GetType(Repository(Of )))
[For](GetType(INHibernateRepository(Of ))).Use(GetType(NHibernateRepository(Of )))
[For](GetType(IRepositoryWithTypedId(Of ,))).Use(GetType(RepositoryWithTypedId(Of ,)))
[For](GetType(INHibernateRepositoryWithTypedId(Of ,))).Use(GetType(NHibernateRepositoryWithTypedId(Of ,)))
End Sub
Private Sub AddCustomRepositories()
Scan(AddressOf SetupCustomRepositories)
End Sub
Private Shared Sub SetupCustomRepositories(ByVal y As IAssemblyScanner)
y.Assembly("DebtRemedy.Core")
y.Assembly("DebtRemedy.Data")
y.WithDefaultConventions()
End Sub
Private Sub AddApplicationServices()
Scan(AddressOf SetupApplicationServices)
End Sub
Private Shared Sub SetupApplicationServices(ByVal y As IAssemblyScanner)
y.Assembly("DebtRemedy.ApplicationServices")
y.With(New FirstInterfaceConvention)
End Sub
End Class
Public Class FirstInterfaceConvention
Implements ITypeScanner
Public Sub Process(ByVal type As Type, ByVal graph As PluginGraph) Implements ITypeScanner.Process
If Not IsConcrete(type) Then
Exit Sub
End If
''//only works on concrete types
Dim firstinterface = type.GetInterfaces().FirstOrDefault()
''//grabs first interface
If firstinterface IsNot Nothing Then
graph.AddType(firstinterface, type)
Else
''//registers type
''//adds concrete types with no interfaces
graph.AddType(type)
End If
End Sub
End Class
He intentado tanto ForRequestedType (que creo que ahora está en desuso) y para. IRepository (Of T) vive en SharpArch.Core.PersistenceSupport. Repositorio (Of T) vive en SharpArch.Data.NHibernate.
Mi clase ServiceLocator
Public Class StructureMapServiceLocator
Inherits ServiceLocatorImplBase
Private container As IContainer
Public Sub New(ByVal container As IContainer)
Me.container = container
End Sub
Protected Overloads Overrides Function DoGetInstance(ByVal serviceType As Type, ByVal key As String) As Object
Return If(String.IsNullOrEmpty(key), container.GetInstance(serviceType), container.GetInstance(serviceType, key))
End Function
Protected Overloads Overrides Function DoGetAllInstances(ByVal serviceType As Type) As IEnumerable(Of Object)
Dim objList As New List(Of Object)
For Each obj As Object In container.GetAllInstances(serviceType)
objList.Add(obj)
Next
Return objList
End Function
End Class
Mi clase controllerfactory
Public Class ServiceLocatorControllerFactory
Inherits DefaultControllerFactory
Protected Overloads Overrides Function GetControllerInstance(ByVal requestContext As RequestContext, ByVal controllerType As Type) As IController
If controllerType Is Nothing Then
Return Nothing
End If
Try
Return TryCast(ObjectFactory.GetInstance(controllerType), Controller)
Catch generatedExceptionName As StructureMapException
System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave())
Throw
End Try
End Function
End Class
El material de inicialización en mi Global.asax
Dim container As IContainer = New Container(New DefaultRegistry)
ControllerBuilder.Current.SetControllerFactory(New ServiceLocatorControllerFactory())
ServiceLocator.SetLocatorProvider(Function() New StructureMapServiceLocator(container))
Mi prueba controlador
Public Class DataCaptureController
Inherits BaseController
Private ReadOnly clientRepository As IClientRepository()
Private ReadOnly pageRepository As IRepository(Of Page)
Public Sub New(ByVal clientRepository As IClientRepository(), ByVal pageRepository As IRepository(Of Page))
Check.Require(clientRepository IsNot Nothing, "clientRepository may not be null")
Check.Require(pageRepository IsNot Nothing, "pageRepository may not be null")
Me.clientRepository = clientRepository
Me.pageRepository = pageRepository
End Sub
Function Index() As ActionResult
Return View()
End Function
El anterior funciona bien cuando lo saco todo lo relacionado con la pageRepository que es IRepository (Of T).
Cualquier ayuda con esto sería muy apreciado.
No hay solución correcta
Otros consejos
Yo tenía un problema similar ayer con una instancia de IRepository (De myEntity).
tuve que y.ConnectImplementationsToTypesClosing(GetType(IRepository(Of )))
estado en mi delegado de escaneo para hacer StructureMap mapa tipos genéricos para su aplicación.
De esta manera:
Private Shared Sub SetupCustomRepositories(ByVal y As IAssemblyScanner)
y.Assembly("DebtRemedy.Core")
y.Assembly("DebtRemedy.Data")
y.WithDefaultConventions()
y.ConnectImplementationsToTypesClosing(GetType(Of ));
End Sub
Asegúrese de que está solamente creando un contenedor.
También convierte un proyecto de C # del castillo de Windsor a StructureMap. El proyecto basado en CW original de instancia un contenedor en Application_Start () (MVC2 proyecto) y se la pasó alrededor para la configuración. Me quedé con el mismo enfoque sin pensar, un poco al traducir del español al Inglés literalmente, y es igual de malo. :)
Lo que pasa es que terminé la creación de un segundo recipiente SM. contenedor de StructureMap es estático, por lo que siempre hay uno "en el fondo". Si Nueva hasta un contenedor, en realidad se crea un segundo contenedor independiente. si no se tiene cuidado, se termina usando a veces una, a veces la otra, y obtener una plaga de "Sin instancia predeterminada" errores en varios puntos cuando se sabe que está definido ..
La forma en que me encontré es que terminé ensuciando mi código con WhatDoIHave () llamadas, lo cual fue una suerte, porque he observado que a veces vi un recipiente configurado (el segundo) y, a veces vi el estático (la primera ), que no había sido configurado. Diferentes nombres GUID fue el sorteo.
Comprobar si el mismo está ocurriendo en el código VB.
No es que familiarizado con esto, pero parece que no puede ser registrado en el contenedor o porque el sistema de resolución es codicioso podría elegir un constructor que no tiene elementos registrados. Las siguientes URL miradas muy similares al mismo problema miren ... http://learningbyfailing.com / 2010/02 / StructureMap en excepciones-no-default-instance-definido para-pluginfamily-iformsauthentication /