Question

Je travaille dans un environnement VB.Net et ont récemment été chargé de créer un environnement MVC à utiliser comme base de travail. J'ai décidé de convertir la dernière version de SharpArchitecture (Q3 2009) dans VB, qui dans l'ensemble est allé bien après un peu de tirer les cheveux. Je suis tombé sur un problème avec le château de Windsor, où mon interface de référentiel personnalisé (vit dans le noyau / projet de domaine) qui a été fait référence dans le constructeur de mon contrôleur de test n'a pas été obtenir injecté à la mise en œuvre concrète (du projet de données). Je frappe un mur de briques avec ce donc en gros a décidé de passer à Windsor Castle pour StructureMap.

Je crois avoir mis en œuvre ce ok car tout est compilé et exécuté et mon contrôleur a couru ok lors du référencement d'une interface de référentiel personnalisé. Il semble maintenant que j'ai / ou ne peut pas maintenant configurer mes interfaces génériques correctement (j'espère que cela a un sens pour autant que je suis nouveau à tout cela). Quand j'utilise IRepository (Of T) (voulant qu'il soit injecté avec une mise en œuvre concrète du référentiel (de type)) dans le constructeur du contrôleur, je reçois l'erreur d'exécution suivante:

"StructureMap Code d'exception: 202 Aucune instance par défaut défini pour PluginFamily SharpArch.Core.PersistenceSupport.IRepository`1 [[DebtRemedy.Core.Page, DebtRemedy.Core, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]], SharpArch.Core, version = 1.0.0.0, Culture = neutral, PublicKeyToken = b5f559ae0ac4e006"

Voici mes extraits de code que j'utilise (mon projet est appelé DebtRemedy).

Ma classe de registre 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

Je l'ai essayé les deux ForRequestedType (que je pense est maintenant dépréciée) et. IRepository (Of T) vit dans SharpArch.Core.PersistenceSupport. Repository (Of T) vit dans SharpArch.Data.NHibernate.

Ma classe 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

Ma classe 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

Les choses Initialiser dans mon global.asax

Dim container As IContainer = New Container(New DefaultRegistry)
ControllerBuilder.Current.SetControllerFactory(New ServiceLocatorControllerFactory())

ServiceLocator.SetLocatorProvider(Function() New StructureMapServiceLocator(container))

Mon contrôleur de test

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

Les travaux ci-dessus bien quand je sors tout à voir avec la pageRepository qui est IRepository (Of T).

Toute aide à ce serait grandement apprécié.

Pas de solution correcte

Autres conseils

J'ai eu un problème similaire avec hier instanciation IRepository (de MyEntity).

Je devais y.ConnectImplementationsToTypesClosing(GetType(IRepository(Of ))) de l'Etat dans mon délégué d'analyse pour faire StructureMap carte types génériques à leur mise en œuvre.

Comme ceci:

Private Shared Sub SetupCustomRepositories(ByVal y As IAssemblyScanner)
    y.Assembly("DebtRemedy.Core")
    y.Assembly("DebtRemedy.Data")
    y.WithDefaultConventions()
    y.ConnectImplementationsToTypesClosing(GetType(Of ));
End Sub

Assurez-vous que vous créez un seul conteneur.

J'ai également converti un projet C # du château de Windsor à StructureMap. Le projet basé CW original instancié un conteneur en Application_Start () (projet MVC2) et passé autour de la configuration. J'ai gardé la même approche sans y penser, un peu quand vous traduisez de l'espagnol à l'anglais litterally, et il est tout aussi mauvais. :)

Ce qui est arrivé est que je fini par créer un second conteneur SM. conteneur de StructureMap est statique, et donc il y a toujours un « en arrière-plan ». Si vous nouvelle un conteneur, vous créez en fait un second, récipient indépendant. si vous n'êtes pas prudent, vous finissez par parfois en utilisant un, tantôt l'autre, et obtenez une plaie d'erreurs « Aucune instance par défaut » à différents points quand vous savez qu'il est défini ..

La façon dont je suis tombé sur ce que j'ai fini par encombrer mon code WhatDoIHave () appelle, qui a eu la chance parce que je remarquai que, parfois, j'ai vu un conteneur configuré (le deuxième) et parfois j'ai vu la statique (la première ), qui n'a pas été configuré. Les différents noms GUID était le cadeau.

Vérifier si la même chose se passe dans votre code VB.

pas familier avec cela, mais il semble que cela ne peut pas être inscrit sur le récipient ou parce que le résolveur est gourmand, il peut choisir un constructeur qui ne disposait pas d'articles enregistrés. L'URL suivante est très similaire au même problème un coup d'oeil ... http://learningbyfailing.com / 2010/02 / StructureMap-exception-no-instance définie par défaut-pour-pluginfamily iformsauthentication /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top