2013-02-04 21 views
5

È il IServiceProvider fondamentalmente solo un'interfaccia generica per qualsiasi contenitore IOC o è utilizzato per un framework specifico? Sto arrotolando il mio contenitore di IOC leggero e sto volendo sapere se dovrei implementarlo. Ci sono altre interfacce che dovrei implementare? Non sono davvero interessato né a MEF né a Unità. Ho usato entrambi ampiamente e in realtà non funzionano per il mio progetto attuale.Quale framework utilizza `IServiceProvider`?

risposta

4

IServiceProvider è un importato (o detenuti-over forse) COM interfaccia che è destinato ad essere utilizzato per funzioni private nel contesto dell'oggetto chi si interroga per un servizio. Il termine 'Servizio' è applicato piuttosto liberamente qui, originariamente significava qualsiasi oggetto COM che poteva essere restituito in base a quale GUID è stato dato.

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

In .NET, non è necessario per la sua attuazione a meno che non si dispone di un client che supporta in modo specifico, e in molti casi non sarà necessario aggiungere un ulteriore livello di indirezione questo è implicito usando IServiceProvider. Inoltre, puoi ideare il tuo schema per condividere oggetti comuni o implementare altri modelli di utilizzo basati su IoC/Iniezione delle dipendenze che sono più flessibili o più rigidi in base alle tue esigenze.

Un buon contesto storico per IServiceProvider è IE Browser Plugin Spec. Qui, viene utilizzato per consentire ai componenti del plug-in di utilizzare le funzionalità dell'host del browser nel contesto. In un contesto COM, questa interfaccia è utile perché nasconde i dettagli dell'istanza e può anche essere utilizzata come parte di una costruzione di oggetti e strategia di utilizzo per evitare loop di riferimento.

WebBrowser Customization (Part 2) @ MSDN

2

Penso che sia un'interfaccia piuttosto generica, quindi puoi usarla con qualsiasi cosa. Non dovrebbe quasi nemmeno essere nella libreria di classi Framework. Per un uso specifico, Alex D. James del team WCF Data Services ha un blog a riguardo.

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

io non penso che abbia qualcosa a che fare con i contenitori CIO. Ho usato Unity e Autofac un bel po 'e non l'ho mai visto usato con nessuno dei due. Per quanto riguarda posizionare il proprio, vorrei suggerire di definire la propria interfaccia contenitore in modo generico più standard:

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

che è abbastanza standard con qualche variazione, ma si potrebbe anche semplicemente usare IServiceProvider se che si adatta alle vostre esigenze.

E su questa nota, a meno che questo non sia solo un esercizio accademico, potresti leggere "Iniezione di dipendenza". Mark Seemann copre ogni contenitore là fuori e un bel po 'di teoria e pratica. Cioè, lo consiglio vivamente.

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

+0

Bello! Grazie lo farò. – Jordan

1

ASP.NET 5 utilizza IServiceProvider in modalità "self-hosted", ovvero quando ospita un'applicazione ASP.NET e il runtime in un'applicazione o un servizio di console.
(un oggetto di tipo Microsoft.Framework.Runtime.Common.DependencyInjection.ServiceProvider - che implementa IServiceProvider - viene passato al costruttore dell'app della console.)

Pertanto, se si desidera utilizzare un contenitore IoC diverso in ASP.NET 5, è possibile implementare questa interfaccia. Oppure avvolgi l'altro contenitore IoC in una classe che implementa questa interfaccia.

+0

ASP.NET Core (ex ASP.NET 5) usa sempre 'IServiceProvider', non solo quando" self-hosting ". – John

Problemi correlati