2013-02-04 8 views
5

Czy w zasadzie jest to zwykły interfejs dla dowolnego kontenera IOC, czy też jest używany w konkretnym środowisku? Toczę swój własny lekki pojemnik IOC i chcę wiedzieć, czy powinienem go wdrożyć. Czy są jakieś inne interfejsy, które powinienem wdrożyć? Nie jestem naprawdę zainteresowany ani MEF, ani jednością. Używałem ich zarówno szeroko, jak i nie pracują dla mojego obecnego projektu.Jakie ramy używają `IServiceProvider`?

Odpowiedz

4

IServiceProvider jest importowany (albo utrzymywane przez) COM interfejs, który ma być używany do indywidualnych cech w kontekście obiektu kogo przesłuchać za Usługę. Termin "Usługa" jest tutaj stosowany dość luźno, pierwotnie oznaczał dowolny obiekt COM, który można zwrócić na podstawie podanego identyfikatora GUID.

IServiceProvider @ MSDN (.NET reference)
IServiceProviderImpl Class @ MSDN (C++ ATL reference)

W .NET, nie trzeba wdrożyć go, chyba że masz klienta, który specyficznie obsługującego go, aw wielu przypadkach nie trzeba będzie dodać kolejny poziom zadnie wynika to z używania IServiceProvider. Można również opracować własny schemat udostępniania wspólnych obiektów lub implementować inne wzorce użycia oparte na IoC/Dependency Injection, które są bardziej elastyczne lub bardziej sztywne, zgodnie z Twoimi potrzebami.

Jednym z dobrych kontekstów historycznych dla IServiceProvider jest specyfikacja wtyczki przeglądarki IE. W tym miejscu pozwala składnikom wtyczki korzystać z funkcji Host przeglądarki w kontekście. W kontekście COM ten interfejs jest użyteczny, ponieważ ukrywa szczegóły tworzenia instancji, a także może być używany jako część strategii budowy i wykorzystania obiektu, aby uniknąć pętli referencyjnych.

WebBrowser Customization (Part 2) @ MSDN

2

Myślę, że jest to dość ogólny interfejs użytkownika, więc można go używać z niczym. To prawie nie powinno być nawet w bibliotece klasy ramowej. Dla jednego konkretnego zastosowania, Alex D. James z zespołu WCF Data Services ma bloga na ten temat.

http://blogs.msdn.com/b/alexj/archive/2010/01/07/creating-a-data-service-provider-part-2-iserviceprovider-datasources.aspx

Nie sądzę, że ma coś wspólnego z kontenerów IoC. Użyłem Unity i Autofac całkiem sporo i nigdy nie widziałem, żeby był z nimi używany. Co do toczenia własne, chciałbym zaproponować Ci określić swój własny interfejs pojemnik w bardziej standardowy sposób rodzajowy:

public interface IContainer 
{ 
    T Resolve<T>(); 
} 

To jest dość standardowe z pewnymi zmianami, ale można też po prostu użyć IServiceProvider czy to pasuje do Twoich potrzeb.

I w tej notatce, chyba że jest to tylko ćwiczenie akademickie, możesz przeczytać "Dependency Injection". Mark Seemann obejmuje każdy kontener i sporo teorii i praktyki. To znaczy, bardzo go polecam.

https://www.amazon.com/Dependency-Injection-NET-Mark-Seemann/

+0

Nice! Dzięki, będe. – Jordan

1

Program ASP.NET 5 używa trybu IServiceProvider w trybie "hostowania autonomicznego", to znaczy podczas hostowania aplikacji ASP.NET i środowiska wykonawczego w aplikacji lub usłudze konsoli.
(Obiekt typu Microsoft.Framework.Runtime.Common.DependencyInjection.ServiceProvider - który implementuje IServiceProvider - jest przekazywany do konstruktora aplikacji konsoli.)

Tak więc, jeśli chciałbyś użyć innego kontenera IoC w ASP.NET 5, możesz zaimplementować ten interfejs. Lub zawiń drugi kontener IoC w klasę, która implementuje ten interfejs.

+0

ASP.NET Core (poprzednia ASP.NET 5) zawsze używa 'IServiceProvider', nie tylko podczas" self-hostingu ". – John

Powiązane problemy