Czy obecna wersja StructureMap obsługuje ASP.Net Web API, MVC 4 i .NET Framework 4.5?StructureMap i ASP .Net Web API i .Net Framework 4.5
Odpowiedz
Zgodnie z opisem here, webowy interfejs API korzysta z narzędzia do rozwiązywania zależności.
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()
{
}
}
iw swoim Global.asax.cs, to ten wiersz do rejestracji resolverowi Zależność:
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver();
Poza tym, nowa Web API jest bardzo łatwy w obsłudze z kontenerów IoC.
Jeszcze się do tego nie zaglądałem, ale uważam, że metoda BeginScope
, którą zostawiłem pustą, może być używana z pojemnikami dla dzieci.
Edit:
Powyższa implementacja działa świetnie; w rzeczywistości wolę to od alternatywy, którą zaraz wam powiem. Ten rozwiąże każdy typ do najlepszych możliwości StructureMap i będzie zgłaszał błędy, gdy coś pójdzie nie tak. Lubię widzieć błędy, ponieważ pokazują mi, co zrobiłem źle.
Jednak interfejs API oczekuje, że GetService
zwróci wartość null, jeśli coś pójdzie nie tak. Tak, aby były zgodne z API, jest zalecana realizacja:
public object GetService(Type serviceType)
{
if (serviceType.IsAbstract || serviceType.IsInterface)
return ObjectFactory.TryGetInstance(serviceType);
else
return ObjectFactory.GetInstance(serviceType);
}
Różnica polega na tym, że TryGetInstance
wygląda tylko dla typów zarejestrowane w pojemniku i zwróci null, jeśli coś pójdzie nie tak. serviceType.IsAbstract || serviceType.IsInterface
jest uważany za wystarczająco dobry, aby zdecydować, której metody użyć. Moja pierwotna odpowiedź miała być prosta i prosta, ale w komentarzach @PHeiberg zaznacza, że nie była ona całkowicie "poprawna". Teraz, kiedy masz wiedzę, użyj tego, co wydaje się najlepsze.
ASP.NET Web API Wersja Release korzysta z narzędzia do rozwiązywania zależności (implementacja interfejsu IDependencyResolver) i wprowadza także nową koncepcję - zakres zależności (implementacja interfejsu IDependencyScope). Ważne jest prawidłowe wdrożenie narzędzia IDependencyScope - jeśli jest właściwie zaimplementowane, pozwala zwolnić zasoby (utworzone w zakresie) po usunięciu IDependencyScope. I jest usuwany po zakończeniu żądania.
IDependencyScope działa najlepiej, gdy kontener obsługuje zagnieżdżone (lub podrzędne) kontenery. StructureMap robi to od wersji 2.6.1.
napisałem artykuł Jak skonfigurować StructureMap w Web API: Configuring StructureMap in ASP.NET WebAPI
Można również sprawdzić artykuł Mike Wasson: Using the Web API Dependency Resolver
- 1. Autofac i ASP .Net MVC 4 Web API
- 2. IIS6 i .Net 4.5?
- 3. Routing w ASP NET Web API - dla różnych wersji API
- 4. .Net Web API Routing i pomoc Strona
- 5. .NET i ASP vs PHP
- 6. .Net Core Web API
- 7. Wymagania systemowe .NET Framework 4.5 operacyjny (bez Vista i XP)
- 8. Jak zainstalować .NET 4.5?
- 9. Asp-net Web API wyjście datetime z literą T
- 10. ASP .Net Web API pobierania obrazów jako binarny
- 11. Usługi IIS 7.5 i ASP .NET 2.0
- 12. Czy System.Web.Optimization jest częścią .Net Framework 4.5?
- 13. .Net Framework 4.5 AddObject() nie pojawia się
- 14. .NET Framework 4.5 zapewnia obsługę SSE4/AVX?
- 15. Prośby ASP.NET i .NET 4.5 - Dziwne zachowanie
- 16. ERR_SPDY_PROTOCOL_ERROR Ajax .net web api
- 17. ClickOnce nie zainstaluje .NET 4.5
- 18. Różnice między środowiskiem .Net Full a .Net Core Framework 4.5 używanym przez środowisko wykonawcze K?
- 19. konfiguracja asp.net z .net 4.5
- 20. ma .Net 4.5 zawierają .Net 4.0
- 21. Czy .net 4.5 działa obok .net 4.0?
- 22. ASP .Net Entity Framework .tt Pliki nie zagnieżdżone pod .edmx
- 23. Czy instalacja .NET 4.5 NAPRAWDĘ zastępuje zespoły .NET 4.0?
- 24. CORS w ASP .NET MVC5
- 25. Przepisywanie adresów URL w ASP.NET 4.5 i Web API
- 26. Entity Framework 5.0 - wymagana minimalna wersja .Net Framework? .Net 4.0 lub 4.5?
- 27. ASP .Net WorldPay Integration
- 28. Jak zachować zachowanie .Net 4.0, jeśli .Net 4.5 jest zainstalowany?
- 29. skompilować NET 4.0 projekt na serwerze kompilacji z .net 4.5
- 30. Wersja C# i .NET Framework Version?
StructureMap nie obsługuje rozdzielczość zależnościach jak tu spodziewać. Sprawdź ten przykład i komentarze Jeremy'ego: http://ardalis.com/How-Do-I-Use-StructureMap-with-ASP.NET-MVC-3 – PHeiberg
Właściwie to zadziała. Jeremy mówi, że 'TryGetInstance' rozwiązuje się tylko wtedy, gdy' serviceType' jest jawnie zarejestrowany. 'GetInstance' nadal rozwiąże typy, które nie są zarejestrowane, ale są konkretne. – kelloti
Rozdzielczość instancji będzie działać z Twoim kodem. Jednak interpretuję link opublikowany jako proponowana "najlepsza praktyka", ponieważ sam Jeremy [zaleca to] (http://codebetter.com/jeremymiller/2011/01/23/if-you-are-using-structuremap-with -mvc3-proszę-przeczytaj-to /). Przypuszczam, że metoda GetService ma zwrócić wartość null, zamiast generować wyjątek, jeśli typ nie jest możliwy do rozstrzygnięcia przez kontener. – PHeiberg