Frage

Ich arbeite in einer Umgebung VB.Net und haben vor kurzem mit dem Erstellen einer MVC-Umgebung zu verwenden als Basis der Arbeit von beauftragt worden. Ich beschloss, den neuesten SharpArchitecture Release (Q3 2009) in VB umzuwandeln, die im Großen und Ganze gegangen fein nach einem bisschen Haare ziehen hat. Ich stieß auf ein Problem mit Schloss Windsor, wo meine benutzerdefinierte Repository-Schnittstelle (Leben im Kern / Domain-Projekt), die Referenz im Konstruktor meines Test-Controller war nicht mit der konkreten Umsetzung (von dem Datenprojekt) injizierte zu werden. Ich schlug eine Mauer mit dieser so grundsätzlich wechseln aus Schloss Windsor für StructureMap entschieden.

Ich glaube, ich umgesetzt habe diese ok, da alles kompiliert und läuft und meinen Controller läuft ok, wenn eine benutzerdefinierte Repository-Schnittstelle verweist. Es scheint nun, dass ich / oder kann jetzt nicht mein Setup generische Schnittstellen up richtig (ich hoffe, das macht so viel Sinn, wie ich all dies bin hier). Wenn ich IRepository verwenden (Of T) (will es mit einer konkreten Implementierung von Repository injiziert werden (Of Type)) im Controller Konstruktor ich die folgenden Laufzeitfehler bin immer:

"StructureMap Ausnahmecode: 202 Kein Standardinstanz definiert für 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"

Hier sind meine Code Auszüge, dass ich verwende (mein Projekt DebtRemedy genannt).

Meine StructureMap Registrierungs Klasse

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

Ich habe beide ForRequestedType versucht (was meiner Meinung nach ist jetzt veraltet) und für. IRepository (Of T) lebt in SharpArch.Core.PersistenceSupport. Repository (Of T) lebt in SharpArch.Data.NHibernate.

Meine Servicelocator Klasse

    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

Meine Controller Klasse

    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

Die Initialise Sachen in meinem global.asax

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

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

Mein Test-Controller

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

Die obigen funktioniert gut, wenn ich alles nehmen mit dem pageRepository zu tun, das ist IRepository (Of T).

Jede mit dieser Hilfe würde sehr geschätzt werden.

Keine korrekte Lösung

Andere Tipps

Ich hatte ein ähnliches Problem gestern mit Instanziieren IRepository (Of MyEntity).

Ich musste Zustand y.ConnectImplementationsToTypesClosing(GetType(IRepository(Of ))) in meinem Scan Delegierten machen StructureMap generische Typen auf ihre Implementierung abzubilden.

Wie folgt aus:

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

Überprüfen Sie, ob Sie nur die Schaffung eines Behälters.

I umgewandelt auch einen C # -Projekt von Schloss Windsor zu StructureMap. Die ursprüngliche CW-basierte Projekt instanziiert einen Container in Application_Start () (MVC2 Projekt) und übergeben es um für die Konfiguration. Ich hielt den gleichen Ansatz, ohne zu denken, ein bisschen, wenn Sie aus dem Spanischen ins Englische übersetzen litterally, und es ist genauso schlimm. :)

Was passiert ist, dass ich am Ende einen zweiten SM Behälter zu schaffen. StructureMap des Container ist statisch, und so gibt es immer eine „im Hintergrund“. Wenn Sie einen Container neu auf, erstellen Sie tatsächlich einen zweiten, unabhängigen Behälter. wenn Sie nicht vorsichtig sind, Sie am Ende manchmal einen verwenden, manchmal die anderen, und eine Plage von „No Standardinstanz“ Fehler an verschiedenen Punkten erhalten, wenn Sie es definiert wissen ..

So wie ich über sie kam, ist, dass ich meinen Code mit WhatDoIHave endete Littering () Anrufe, die glücklich waren, weil ich festgestellt, dass manchmal sah ich einen konfigurierten Behälter (die zweite) und manchmal sah ich die statischen (die ersten ), die nicht konfiguriert war. Verschiedener GUID Name war das Werbegeschenk.

Überprüfen Sie, ob das gleiche in Ihrem VB-Code geschieht.

nicht so vertraut mit diesem, aber es sieht aus wie es nicht mit dem Behälter eingetragen sein kann, oder weil der Resolver gierig ist, es könnte einen Konstruktor wählen, die nicht registrierten Elemente haben. Die folgende URL sieht sehr ähnlich das gleiche Problem zu sehen, ... http://learningbyfailing.com / 2010/02 / StructureMap-Ausnahme-no-default-Instanz definiert-for-pluginfamily-iformsauthentication /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top