Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Veel onderdelen van de VisualStudio.Extensibility SDK, zoals opdrachthandlers en hulpprogrammavensterproviders, worden geïmplementeerd als afzonderlijke klassen. Om onderdelen tussen deze klassen te delen, maakt de SDK gebruik van .NET-afhankelijkheidsinjectie om deze klassen indien nodig te instantiëren. Om het delen van gegevens tussen deze onderdelen te vereenvoudigen, raden we ontwikkelaars van extensies aan om ook hun gedeelde onderdelen bij te dragen aan de afhankelijkheidsinjectiegrafiek.
Interne services toevoegen aan afhankelijkheidsinjectiegrafiek
Elke extensie in de VisualStudio.Extensibility SDK heeft een eigen servicegrafiek die wordt gemaakt wanneer de extensie voor het eerst wordt geladen. Extensies kunnen de methode InitializeServices overschrijven om hun eigen services toe te voegen aan de afhankelijkheidsinjectiegrafiek. U kunt verwijzen naar Markdown Linter- voor een voorbeeld van het gebruik van afhankelijkheidsinjectie om een service te delen.
Notitie
In tegenstelling tot het IServiceProvider patroon van Visual Studio SDK zijn deze services alleen zichtbaar voor andere onderdelen binnen dezelfde extensie en zijn ze niet bedoeld om te worden gedeeld met andere extensies.
Services geleverd door VisualStudio.Extensibility SDK
Naast services die worden geleverd door de extensie, voegt VisualStudio.Extensibility SDK de volgende services toe aan de grafiek bij het maken van het extensie-exemplaar:
TraceSource: er wordt een gedeeld exemplaar van TraceSource toegevoegd aan de grafiek die onderdelen kunnen gebruiken om waarschuwingen en fouten te registreren. Deze logboeken kunnen handig zijn om problemen met de extensie vanuit klantrapporten vast te stellen.VisualStudioExtensibility: Extensibiliteitsinstantie die API's biedt om te communiceren met Visual Studio, zoals documenten, de editor en de werkruimte.
IServiceBroker: de servicebroker kan worden gebruikt voor toegang tot brokered services aangeboden door Visual Studio of andere services die mogelijk geen deel uitmaken van hetVisualStudioExtensibilitysurface area.IServiceProvider: de serviceprovider kan worden gebruikt om services op te vragen in de eigen afhankelijkheidsinjectiegrafiek van de extensie. Dit exemplaar is niet hetzelfde exemplaar als de globale serviceprovider in het Visual Studio-proces voor in-procesextensies.
Aanvullende services voor in-proces extensies
Voor extensies die in het proces worden uitgevoerd, zijn ook de volgende services beschikbaar:
JoinableTaskFactoryenJoinableTaskContext: bij uitvoering als een in-process-extensie die gebruikmaakt van andere Visual Studio-services, is het mogelijk nodig om deze exemplaren te gebruiken om te communiceren met de hoofdthread zonder impasses te veroorzaken. Zie Visual Studio Threading-kookboekvoor meer informatie.AsyncServiceProviderInjection en MefInjection: Deze klassen kunnen worden gebruikt om in-process services op te halen die worden aangeboden door de
IServiceProvider- ofMEF-infrastructuur in de VisualStudio.Extensibility-extensiecomponenten. Wanneer deze beschikbaar is, raden we u aan eerst gebruik te maken van services die worden aangeboden door de VisualStudio.Extensibility SDK.IAsyncServiceProvider2: deze klasse kan worden gebruikt als alternatief voorAsyncServiceProviderInjectionom te zoeken naar in-process Visual Studio-services met behulp vanGetServiceAsyncmethode.
Extensiemethoden die worden geleverd door VisualStudio.Extensibility SDK
Uitbreidingsmethoden voor het IServiceCollection-exemplaar kunnen ook worden gebruikt om services toe te voegen die betrekking hebben op uitbreidbaarheidsfuncties:
- AddSettingsObservers: deze methode wordt gegenereerd wanneer een extensie een SettingsCategory- bijdraagt en kan worden aangeroepen in
InitializeServicesom waarnemersservices in te voegen voor de categorie bijgedragen instellingen. U kunt verwijzen naar SettingsSample- om een voorbeeld te zien van deze methode die wordt gebruikt.
Levensduur van de service
Wanneer u een nieuwe service toevoegt aan de afhankelijkheidsinjectiegrafiek in InitializeServices methode, zijn er drie verschillende levensduuropties. U kunt ook verwijzen naar voorbeeld over hoe verschillende levensduuropties worden gebruikt in een extensie.
AddSingleton: deze services delen dezelfde levensduur als het extensie-exemplaar. In de meeste gevallen is het gebruik van singleton-services de juiste keuze voor een VisualStudio.Extensibility SDK-extensie.AddTransient: Tijdelijke services maken een nieuw exemplaar van de implementatieklasse of roepen de factorymethode aan telkens wanneer een service deze opvraagt. Als gevolg hiervan krijgt elk onderdeel een eigen exemplaar van de service.AddScoped: Deze reikwijdte is alleen van toepassing op klassen die hetVisualStudioContributionattribuut hebben en de diensten die door hen worden opgevraagd. In de context van VisualStudio.Extensibility SDK wordt een bereik gedefinieerd door de levensduur van een bijgedragen onderdeel. In de meeste gevallen is deze levensduur hetzelfde als de levensduur van de extensie, zodat scoped versus singleton-services hetzelfde werken. Documentatie zal een speciale opmerking maken als er onderdelen zijn bijgedragen met verschillende levensduur.
Voorbeeld van use case
In dit voorbeeld ziet u hoe u een gedeeld gegevensbronobject gebruikt tussen een implementatie van een hulpprogrammavenster en een opdrachthandler met behulp van afhankelijkheidsinjectie en InitializeServices.
In
MyExtension.InitializeServiceswordtMyDataSourcetoegevoegd als een singleton-service, omdat deze wordt gedeeld tussen onderdelen.MyToolWindowControlwordt als transiënt toegevoegd omdat elke toolvenster-instantie zijn eigen unieke instantie van het gehoste besturingselement moet hebben.In
MyToolWindowinjecteren weIServiceProviderin de constructor om vroege initialisatie vanMyToolWindowControlte voorkomen en in plaats daarvan query's uit te voeren viaGetRequiredServicewanneer dat nodig is.
[VisualStudioContribution]
public class MyExtension : Extension
{
protected override void InitializeServices(IServiceCollection serviceCollection)
{
// Always make sure to call the base method to add required services.
base.InitializeServices(serviceCollection);
serviceCollection.AddSingleton<MyDataSource>();
serviceCollection.AddTransient<MyToolWindowControl>();
}
}
[DataContract]
public class MyDataSource : NotifyPropertyChangedObject
{
}
public class MyToolWindowControl : RemoteUserControl
{
public MyToolWindowControl(MyDataSource dataSource) : base(dataContext)
{
}
}
[VisualStudioContribution]
public class MyToolWindow : ToolWindow
{
private readonly IServiceProvider serviceProvider;
public MyToolWindow(IServiceProvider serviceProvider)
{
}
public override Task<IRemoteUserControl> GetContentAsync(CancellationToken cancellationToken)
{
var control = this.serviceProvider.GetRequiredService<MyToolWindowControl>();
return Task.FromResult<IRemoteUserControl>(control);
}
}
[VisualStudioContribution]
public class MyCommand : Command
{
public MyCommand(MyDataSource dataSource) { }
}