Creare funzionalità personalizzate per progetti di database
È possibile estendere tipi di progetto di database esistenti aggiungendovi funzionalità personalizzate. Ad esempio, è possibile creare una funzionalità che esegua un'azione ogni volta che un progetto di database viene caricato o salvato. È inoltre possibile creare provider dello schema di database e un sistema di progetto di supporto. Tale tipo di estensibilità non è tuttavia trattato in questo contenuto.
Attività comuni
Attività comuni |
Contenuto di supporto |
---|---|
Ulteriori informazioni sui punti di estensibilità: è possibile ottenere informazioni sulla progettazione di estensibilità del progetto di database. |
|
Creare una funzionalità del progetto di esempio: vengono descritti i passaggi richiesti per creare una funzionalità del progetto personalizzata che visualizza una finestra di dialogo al caricamento di un progetto di database. Seguendo queste procedure dettagliate si apprenderà come:
|
|
Installare una funzionalità del progetto personalizzata: dopo avere creato e compilato una funzionalità del progetto, è necessario installarla affinché venga riconosciuta da Visual Studio. |
Obiettivi dell'estensibilità dei progetti
Gli obiettivi principali delle funzionalità di estensibilità del progetto di database in Visual Studio 2010 sono le seguenti:
Esporre componenti principali tramite interfacce
Questo approccio mantiene il sistema del progetto coerente con il modello dello schema, utilizzando interfacce anziché classi astratte. Una sola classe concreta deve essere in grado di implementare molte interfacce.Le funzionalità vengono create da gestione estensibilità
Le funzionalità sono responsabili per parti principali del sistema, tra cui Esplora soluzioni, Visualizzazione schema, aggiornamento del progetto e proprietà del progetto.Le funzionalità possono essere estese
Le funzionalità possono utilizzare gestione estensibilità, file XML, il Registro di sistema o altri approcci per fornire tale estensibilità.I servizi sono esposti tramite la relativa interfaccia
DataPackage implementa IServiceProvider. Qualsiasi interazione tra funzionalità deve essere gestita mediante servizi a questi livelli. Non è necessario esporre la funzionalità come servizio. Al contrario, creare una nuova interfaccia, una classe wrapper, quindi esporre il wrapper come servizio.Gli eventi controllano il sistema del progetto
DataPackage e ProjectNode() offrono eventi che abilitano funzionalità per il controllo il sistema del progetto. Inoltre, le funzionalità possono fornire eventi tramite le interfacce del servizio. In alcuni casi è possibile decidere di utilizzare un delegato. Per decidere quale funzionalità gestisce l'azione, considerare l'utilizzo di un approccio dell'evento in cui le funzionalità possano interagire, in base alla priorità.Non basarsi sull'ordine di listener
Se l'ordine di listener per un evento è importante, considerare la possibilità di creare un pre-evento o un post-evento oppure di aggiungere una proprietà prioritaria alla classe derivata da EventArg.
Assembly di modelli componenti
Gli assembly seguenti forniscono il sistema del progetto di database in Visual Studio.
Microsoft.VisualStudio.Data.Schema.Package.dll
Sistema del progetto di base, nonché avvio automatico e gestione degli eventi della funzionalità. Include funzionalità indipendenti dal database, ad esempio script.Microsoft.VisualStudio.Data.Schema.PackageUI.dll
Assembly satellite per il pacchetto indipendente dal database.Microsoft.VisualStudio.Data.Schema.Package.Sql.dll
Funzionalità specifiche di SQL Server, editor e finestre degli strumenti per Visual Studio.Microsoft.VisualStudio.Data.Schema.Package.SqlUI.dll
Assembly satellite per funzionalità specifiche di SQL Server, editor e finestre degli strumenti.
Punti di estensibilità
È possibile estendere i seguenti punti del sistema del progetto di database:
IDatabaseProjectFeature (AllowMultipleExtensions = true)
Si tratta del punto di estensione primario per il sistema del progetto. Le funzionalità sono progettate per controllare il progetto e contribuire. Sono disponibili diverse interfacce che possono essere implementate facoltativamente: IOleCommandTarget, IDatabaseProjectPriorityCommandTarget, IDatabaseProjectPropertyPageContributor, IDatabaseProjectExtenderContributor<TExtendee>, IDatabaseProjectAddNewItemParticipant, IDatabaseProjectIdleProcessor e IDatabaseProjectPartialProjectParticipant.IDatabaseProjectBuildActionContributor (AllowMultipleExtensions =false)
Fornisce ad esempio stringhe BuildAction all'elenco di possibili operazioni di compilazione nel sistema del progetto, il sistema del progetto SQL Server fornisce Predeploy e Postdeploy.IDatabaseProjectUserFileContributor (AllowMultipleExtensions =false)
Specifica quali proprietà devono essere indirizzate al file con estensione user.IDatabaseSchemaViewController (AllowMultipleExtensions =false)
Popola la visualizzazione dello schema e risponde agli eventi da tale visualizzazione.IDatabaseProjectFileUpgradeController (AllowMultipleExtensions =false)
Aggiorna il file di progetto come documento XML. Questo processo si verifica prima che il sistema del progetto Visual Studio tenti di caricare l'istanza del progetto tramite la factory del progetto.IDatabaseProjectReferenceController (AllowMultipleExtensions = false)
Controlla riferimenti al progettoIDatabaseProjectPartialProjectParticipant (AllowMultipleExtensions = true)
Abilita una funzionalità per filtrare file che non devono essere esportati come un progetto parziale.IDatabaseProjectHelpKeywordProvider
Fornisce la parola chiave della Guida del sistema del progetto utilizzata quando l'utente preme F1.
Ciclo di vita del progetto di database
Ogni file progetto del database (con estensione dbproj) contiene una proprietà denominata "DSP" che indica l'oggetto DatabaseSchemaProvider specifico che gestisce questo progetto quando viene aperto in Visual Studio. Il sistema del progetto crea una Gestione estensioni tramite questo DSP, da cui costruisce tutti i collaboratori del sistema del progetto e le funzionalità del progetto. Ogni funzionalità riceve un evento Initialize in modo che possa inizializzarsi e inserirsi nel sistema del progetto in attesa di eventi.
Gli eventi seguenti vengono generati durante l'apertura/chiusura e salvataggio del progetto:
NewProjectCreated
Questo evento si verifica quando un progetto viene inizialmente creato. È possibile gestire questo evento in modo da visualizzare procedure guidate o finestre di dialogo di installazione.ProjectOpening
Il progetto è in fase di apertura. È possibile gestire questo evento in modo da aggiungere qualsiasi servizio a IDatabaseProjectNode.ProjectOpened
Questo evento si verifica quando tutti i servizi sono stati aggiunti e il progetto ha completato l'apertura. Il progetto non avrà tuttavia ancora completato la deserializzazione dello stato precedente. TaskHost e DataSchemaModel saranno NULL finché non viene inviato l'evento ProjectLoaded.ProjectLoaded
Il progetto è completamente caricato. TaskHost e DataSchemaModel sono pronti per l'utilizzo.ProjectClosing
Il progetto è in fase di chiusura. Si tratta di una buona opportunità per salvare in modo permanente qualsiasi informazione sullo stato al di fuori del file di progetto.ProjectClosed
Il progetto viene chiuso.ProjectSaving
Il progetto sta eseguendo un'operazione di salvataggio. È possibile utilizzare questo evento come un'opportunità per assicurarsi che la funzionalità sia in uno stato che consenta l'archiviazione della persistenza.ProjectSaved
Il progetto è stato salvato.
Gestione degli errori
Ogni progetto dispone di un oggetto ErrorManager. Alcuni errori, a differenza di altri, vengono salvati in modo permanente nel file con estensione dbmdl. Questo comportamento può essere controllato tramite la classe AddPersistedCategory. Per impostazione predefinita, queste categorie vengono salvate in modo permanente: ModelCategory, ValidationAtBuildCategory e ValidationOnIdleCategory. Se si aggiunge un'altra categoria persistente. sarà necessario gestire il ricaricamento del progetto e verificare e gestire gli errori. Tenere presente che anche se il progetto è chiuso, l'utente potrebbe aver modificato il file con estensione dbproj per rimuovere un file per il quale viene segnalato un errore. Sarebbe molto fuorviante per utenti se venisse segnalato un errore nel progetto quando tale file non esiste.
Gli oggetti errore del database vengono aggiunti a ErrorManager in categorie specifiche. Il concetto è che le funzionalità del progetto possono gestire la durata degli errori tramite la durata della categoria. Per quanto riguarda i nomi di categoria che creano conflitti con altre funzionalità, è consigliabile utilizzare un GUID come nome. ErrorManager definisce diverse categorie incorporate, ad esempio:
DefaultCategory
Questa categoria è progettata per essere utilizzata per gli errori la cui durata è uguale alla durata del progetto. Pertanto errori che si verificano, ad esempio, durante il caricamento del progetto, vengono aggiunti a questa categoria.ModelCategory
Questa categoria deve essere utilizzata dal gestore dello schema quando si verificano errori come quelli del parser.
Scenari correlati
Creare tipi o destinazioni di refactoring del database personalizzati
Creare e registrare regole aggiuntive per l'analisi del codice del database
Generare dati di test specializzati con un generatore di dati personalizzato
Definire condizioni personalizzate per gli unit test del database