Antwort

14

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.

+0

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

+0

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

+0

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

8

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