Ich arbeite in einer VB.Net-Umgebung und bin kürzlich damit beauftragt worden, eine MVC-Umgebung zu erstellen, die als Grundlage für die Arbeit dient. Ich habe mich dazu entschlossen, die neueste Version von SharpArchitecture (Q3 2009) in VB umzuwandeln, was im Großen und Ganzen nach ein bisschen Haarziehen gut ging. Ich stieß auf ein Problem mit Castle Windsor, wo meine benutzerdefinierte Repository-Schnittstelle (lebt im Core / Domain-Projekt), die Referenz im Konstruktor meines Test-Controller war nicht mit der konkreten Implementierung (aus dem Datenprojekt) injiziert wurde. Ich habe damit eine Ziegelmauer getroffen, also habe ich beschlossen, Castle Windsor für StructureMap auszuschalten.
Ich denke, ich habe dies in Ordnung umgesetzt, da alles kompiliert und ausgeführt wird und mein Controller lief einwandfrei, wenn er auf eine benutzerdefinierte Repository-Schnittstelle verweist. Es scheint jetzt, dass ich meine generischen Interfaces nicht richtig einrichten kann oder kann (ich hoffe, das macht Sinn, soweit ich neu bin). Wenn ich IRepository (Of T) benutze (es soll eine konkrete Implementierung von Repository (Of Type) in den Controller-Konstruktor eingefügt werden, erhalte ich den folgenden Laufzeitfehler:
)"StructureMap-Ausnahmecode: 202 Keine Standardinstanz für PluginFamily definiert 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 Codeauszüge, die ich verwende (mein Projekt heißt DebtRemedy).
Meine Strukturkarten-Registrierungsklasse
%Vor%Ich habe sowohl ForRequestedType (was ich glaube, dass es jetzt veraltet ist) und For versucht. IRepository (Of T) lebt in SharpArch.Core.PersistenceSupport. Repository (Of T) lebt in SharpArch.Data.NHibernate.
Meine Servicelokalklasse
%Vor%Meine controllerfactory-Klasse
%Vor%Die Dinge in meinem global.asax initialisieren
%Vor%Mein Testcontroller
%Vor%Das obige funktioniert gut, wenn ich alles, was mit dem PageRepository zu tun hat, das IRepository (Of T) ist.
Jede Hilfe mit diesem würde sehr geschätzt werden.
Ich hatte gestern ein ähnliches Problem mit der Instantiierung von IRepository (Of MyEntity).
Ich musste y.ConnectImplementationsToTypesClosing(GetType(IRepository(Of )))
in meinem Scan-Delegaten angeben, damit StructureMap der Implementierung generische Typen zuordnen kann.
So:
%Vor%Stellen Sie sicher, dass Sie nur einen Container erstellen.
Ich habe auch ein C # -Projekt von Castle Windsor nach StructureMap konvertiert. Das ursprüngliche CW-basierte Projekt hat einen Container in Application_Start () (MVC2-Projekt) instanziiert und zur Konfiguration weitergeleitet. Ich habe den gleichen Ansatz beibehalten, ohne darüber nachzudenken, irgendwie, wenn Sie wörtlich aus dem Spanischen ins Englische übersetzen, und es ist genauso schlimm. :)
Was passiert ist, ist, dass ich am Ende einen zweiten SM-Container erstellt habe. Der Container von StructureMap ist statisch und es gibt immer einen "im Hintergrund". Wenn Sie einen Container neu erstellen, erstellen Sie tatsächlich einen zweiten, unabhängigen Container. Wenn Sie nicht vorsichtig sind, verwenden Sie manchmal einen, manchmal den anderen, und erhalten eine Plage von "No Default Instance" Fehlern an verschiedenen Punkten, wenn Sie wissen, dass es definiert ist.
Die Art, wie ich darauf gestoßen bin, ist, dass ich meinen Code mit WhatDoIHave () - Anrufen vermasselt habe, was ein Glück war, weil ich bemerkte, dass ich manchmal einen konfigurierten Container sah (der zweite) und manchmal den statischen (den ersten) ), die nicht konfiguriert wurde. Andere GUID-Namen waren das Giveaway.
Überprüfen Sie, ob das gleiche in Ihrem VB-Code passiert.
Tags und Links asp.net-mvc ioc-container vb.net structuremap s#arp-architecture