2013-02-04 16 views
5

Ist die IServiceProvider im Grunde nur eine generische Schnittstelle für jeden IOC-Container oder wird sie für ein bestimmtes Framework verwendet? Ich rolle meinen eigenen leichten IOC-Container und ich möchte wissen, ob ich ihn umsetzen sollte. Gibt es noch andere Schnittstellen, die ich implementieren sollte? Ich bin nicht wirklich an MEF oder Unity interessiert. Ich habe beide ausgiebig verwendet und sie funktionieren nicht wirklich für mein aktuelles Projekt.Welcher Rahmen verwendet `IServiceProvider`?

Antwort

4

IServiceProvider ist ein importiertes (oder vielleicht gehaltene über) COM-Schnittstelle, die für private Funktionen im Rahmen des Objekts verwendet werden soll, den Sie für einen Dienst abfragen. Der Begriff "Service" wird hier eher lose verwendet, er bedeutete ursprünglich jedes COM-Objekt, das basierend auf der gegebenen GUID zurückgegeben werden konnte.

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

In .NET, brauchen Sie nicht, es zu implementieren, wenn Sie einen Client, der es speziell unterstützt, und in vielen Fällen werden Sie nicht noch einen weiteren Dereferenzierungsebene hinzufügen müssen Dies wird durch die Verwendung IServiceProvider angedeutet. Sie können auch Ihr eigenes Schema entwickeln, um gemeinsame Objekte zu teilen oder andere Nutzungsmuster auf der Basis von IoC/Dependency Injection zu implementieren, die flexibler oder starrer sind, je nach Ihren Anforderungen.

Ein guter historischer Kontext für IServiceProvider ist das IE Browser Plugin Spec. Hier wird es Plug-In-Komponenten ermöglicht, Browser-Host-Funktionen im Kontext zu verwenden. In einem COM-Kontext ist diese Schnittstelle nützlich, da sie die Details der Instanziierung versteckt und auch als Teil einer Objektkonstruktions- und -verwendungsstrategie verwendet werden kann, um Referenzschleifen zu vermeiden.

WebBrowser Customization (Part 2) @ MSDN

2

Ich denke, es ist eine ziemlich allgemeine Benutzeroberfläche, so dass Sie es mit allem verwenden können. Es sollte fast nicht einmal in der Framework-Klassenbibliothek sein. Für einen bestimmten Zweck hat Alex D. James vom WCF Data Services-Team einen Blog darüber.

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

Ich glaube nicht, dass irgendetwas mit IoC Container zu tun hat. Ich habe Unity und Autofac ziemlich oft benutzt und habe es nie bei beiden benutzt. Wie für Ihre eigenen Rollen, würde ich vorschlagen, dass Sie Ihre eigenen Container-Schnittstelle in der mehr Standard allgemeiner Weise definieren:

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

Das ist ziemlich Standard mit einigen Variationen, aber man könnte auch nur IServiceProvider verwenden, wenn das Ihren Bedürfnissen entspricht.

Und in diesem Sinne, wenn dies nicht nur eine akademische Übung ist, möchten Sie vielleicht "Dependency Injection" lesen. Mark Seemann deckt jeden Container und viel Theorie und Praxis ab. Das heißt, ich kann es nur wärmstens empfehlen.

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

+0

Schön! Danke, werde ich. – Jordan

1

ASP.NET 5 verwendet IServiceProvider im "selbst gehosteten" Modus, dh beim Hosten einer ASP.NET-Anwendung und der Laufzeit in einer Konsolenanwendung oder einem Dienst.
(Ein Objekt vom Typ Microsoft.Framework.Runtime.Common.DependencyInjection.ServiceProvider - das IServiceProvider implementiert - wird an Ihren Konsolen-App-Konstruktor übergeben.)

Wenn Sie also einen anderen IoC-Container in ASP.NET 5 verwenden möchten, möchten Sie diese Schnittstelle möglicherweise implementieren. Oder wickeln Sie den anderen IoC-Container in eine Klasse ein, die diese Schnittstelle implementiert.

+0

ASP.NET Core (früher ASP.NET 5) verwendet immer "IServiceProvider", nicht nur wenn "Self-Hosting". – John

Verwandte Themen