Odpowiedz

14

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.

+0

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

+0

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

+0

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

8

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

Powiązane problemy