Problem Implementierung StructureMap in VB.Net Umwandlung von SharpArchitecture
-
23-09-2019 - |
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 /