Unterstützt die aktuelle Version von StructureMap ASP.Net Web API, MVC 4 und .NET Framework 4.5?StructureMap und ASP.Net Web API und .NET Framework 4.5
Antwort
Wie in here beschrieben, verwendet die Web-API einen Abhängigkeits-Resolver.
class StructureMapDependencyResolver : IDependencyResolver
{
public IDependencyScope BeginScope()
{
return this;
}
public object GetService(Type serviceType)
{
return ObjectFactory.GetInstance(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return ObjectFactory.GetInstances(serviceType);
}
public void Dispose()
{
}
}
Und in Ihrem Global.asax.cs, diese Zeile enthält die Abhängigkeit Resolver registrieren:
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver();
Abgesehen davon, dass der neue Web-API ist sehr einfach, mit IoC Behältern zu verwenden.
Ich habe es noch nicht untersucht, aber ich glaube, dass die BeginScope
Methode, die ich leer gelassen habe, mit Kindcontainern verwendet werden kann.
Edit:
Die obige Umsetzung funktioniert gut; in der Tat bevorzuge ich es gegenüber der Alternative, die ich Ihnen gerade sagen werde. Dieser wird jeden Typ auf die besten Fähigkeiten von StructureMap auflösen und Fehler auslösen, wenn etwas schief geht. Ich mag es, Fehler zu sehen, weil sie mir zeigen, was ich falsch gemacht habe. Die API erwartet, dass GetService
null zurückgibt, wenn etwas schief geht. Also mit der API-kompatibel zu sein, ist dies die empfohlene Implementierung:
public object GetService(Type serviceType)
{
if (serviceType.IsAbstract || serviceType.IsInterface)
return ObjectFactory.TryGetInstance(serviceType);
else
return ObjectFactory.GetInstance(serviceType);
}
Der Unterschied besteht darin, dass TryGetInstance
nur für Typen sehen in dem Behälter registriert und wird null zurück, wenn etwas schief geht. serviceType.IsAbstract || serviceType.IsInterface
gilt als gut genug, um zu entscheiden, welche Methode zu verwenden ist. Meine ursprüngliche Antwort sollte klar und einfach sein, aber @PHeiberg weist in den Kommentaren darauf hin, dass es nicht ganz "korrekt" war. Nun, da du Wissen hast, benutze das, was dir am besten erscheint.
ASP.NET Web API Release-Version verwendet Abhängigkeit Resolver (Implementierung von IDependencyResolver Schnittstelle) und es führt auch neue Konzept - Abhängigkeitsbereich (Implementierung von IDependencyScope Schnittstelle). Es ist wichtig, IDependencyScope ordnungsgemäß zu implementieren. Wenn dies ordnungsgemäß implementiert wird, können Ressourcen freigegeben werden (die im Bereich erstellt werden), wenn IDependencyScope entfernt wird. Und es wird entsorgt, wenn die Anfrage endet.
IDependencyScope funktioniert am besten, wenn der Container verschachtelte (oder untergeordnete) Container unterstützt. StructureMap macht es ab Version 2.6.1.
Ich schrieb einen Artikel, wie StructureMap in Web-API konfigurieren: Configuring StructureMap in ASP.NET WebAPI
Sie auch von Mike Wasson überprüfen Artikel können: Using the Web API Dependency Resolver
StructureMap nicht verarbeitet Auflösung von Abhängigkeiten wie hier erwartet. Schauen Sie sich dieses Beispiel und die Kommentare von Jeremy an: http://ardalis.com/How-Do-I-Use-StructureMap-with-ASP.NET-MVC-3 – PHeiberg
Eigentlich wird das funktionieren. Jeremy sagt "TryGetInstance" löst nur auf, wenn 'serviceType' explizit registriert ist. 'GetInstance' wird immer noch Typen auflösen, die nicht registriert sind, aber konkret sind. – kelloti
Die Auflösung von Instanzen funktioniert mit Ihrem Code. Allerdings interpretiere ich den Link, den ich als "Best Practice" vorgeschlagen habe, da Jeremy selbst [empfiehlt es] (http://codebetter.com/jeremymiller/2011/01/23/if-you-use-structemap-with-) -mvc3-bitte-lies das /). Ich nehme an, dass GetService-Methode Null zurückgeben soll, anstatt eine Ausnahme zu generieren, wenn der Typ nicht durch den Container auflösbar ist. – PHeiberg