La versione corrente di StructureMap supporta ASP .Net Web API, MVC 4 e .NET Framework 4.5?StructureMap e ASP .Net Web API e .Net Framework 4.5
risposta
Come descritto here, l'API Web utilizza un resolver di dipendenze.
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()
{
}
}
e nel tuo Global.asax.cs, includere questa linea per registrare il risolutore delle dipendenze:
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver();
A parte questo, la nuova API Web è molto facile da usare con contenitori CIO.
Non l'ho ancora esaminato, ma credo che il metodo BeginScope
che ho lasciato vuoto possa essere usato con i contenitori figlio.
Edit:
È possibile che questo implementazione grandi opere; infatti preferisco l'alternativa che sto per dirti. Questo risolverà qualsiasi tipo con le migliori capacità di StructureMap e genererà errori ogni volta che qualcosa va storto. Mi piace vedere gli errori perché mi mostrano cosa ho sbagliato.
Tuttavia, l'API prevede che GetService
restituirà null se qualcosa va storto. Quindi, per essere compatibile con l'API, questo è l'implementazione consigliata:
public object GetService(Type serviceType)
{
if (serviceType.IsAbstract || serviceType.IsInterface)
return ObjectFactory.TryGetInstance(serviceType);
else
return ObjectFactory.GetInstance(serviceType);
}
La differenza è che TryGetInstance
guarda solo per i tipi registrati nel contenitore e tornerà null se qualcosa va storto. serviceType.IsAbstract || serviceType.IsInterface
è considerato abbastanza buono da un controllo per decidere quale metodo utilizzare. La mia risposta originale era diretta e semplice, ma @PHeiberg sottolinea nei commenti che non era del tutto "corretto". Ora che hai conoscenza, usa quello che sembra il migliore.
La versione di rilascio dell'API Web di ASP.NET utilizza il risolutore di dipendenza (implementazione dell'interfaccia IDependencyResolver) e introduce anche un nuovo concetto - ambito di dipendenza (implementazione dell'interfaccia IDependencyScope). È importante implementare correttamente IDependencyScope: se implementato correttamente, consente di rilasciare risorse (create nell'ambito) quando IDependencyScope viene eliminato. Ed è disposto quando termina la richiesta.
IDependencyScope funziona meglio quando container supporta contenitori nidificati (o child). StructureMap fa dalla versione 2.6.1.
ho scritto un articolo come configurare StructureMap in API Web: Configuring StructureMap in ASP.NET WebAPI
È anche possibile controllare l'articolo da Mike Wasson: Using the Web API Dependency Resolver
StructureMap non gestisce la dipendenza risoluzione come previsto qui. Dai un'occhiata a questo esempio e ai commenti di Jeremy: http://ardalis.com/How-Do-I-Use-StructureMap-with-ASP.NET-MVC-3 – PHeiberg
Attualmente funzionerà. Jeremy dice che 'TryGetInstance' risolve solo se' serviceType' è registrato esplicitamente. 'GetInstance' risolverà comunque i tipi che non sono registrati ma sono concreti. – kelloti
La risoluzione delle istanze funzionerà con il tuo codice. Comunque interpreto il link che ho postato come la proposta "Best Practice", dal momento che Jeremy stesso [lo raccomanda] (http://codebetter.com/jeremymiller/2011/01/23/if-you-are-using-structuremap-with -mvc3-please-lettura-questo /). Immagino che il metodo GetService debba restituire null, invece di generare un'eccezione se il tipo non è risolvibile dal contenitore. – PHeiberg