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 /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top