Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Di Visual Studio, pengguna dapat memvalidasi kode sumber dalam proyek terhadap model lapisan sehingga mereka dapat memverifikasi bahwa kode sumber sesuai dengan dependensi pada diagram dependensi. Ada algoritma validasi standar, tetapi Anda dapat menentukan ekstensi validasi Anda sendiri.
Saat pengguna memilih perintah Validasi Arsitektur pada diagram dependensi, metode validasi standar dipanggil, diikuti oleh ekstensi validasi apa pun yang telah diinstal.
Catatan
Dalam diagram dependensi, tujuan utama validasi adalah membandingkan diagram dengan kode program di bagian lain dari solusi.
Anda dapat mengemas ekstensi validasi lapisan Anda ke dalam Visual Studio Integration Extension (VSIX), yang dapat Anda distribusikan ke pengguna Visual Studio lainnya. Anda dapat menempatkan validator Anda di VSIX dengan sendirinya, atau Anda dapat menggabungkannya dalam VSIX yang sama dengan ekstensi lain. Anda harus menulis kode validator dalam proyek Visual Studio sendiri, bukan dalam proyek yang sama dengan ekstensi lain.
Peringatan
Setelah Anda membuat proyek validasi, salin kode contoh di akhir topik ini lalu edit sesuai kebutuhan Anda sendiri.
Persyaratan
Lihat Persyaratan.
Menentukan Validator Lapisan di VSIX Baru
Metode tercepat untuk membuat validator adalah menggunakan templat proyek. Hal ini menempatkan kode dan manifes VSIX ke dalam proyek yang sama.
Untuk menentukan ekstensi dengan menggunakan templat proyek
Buat proyek Ekstensi Validasi Perancang Lapisan baru.
Templat membuat proyek yang berisi contoh kecil.
Peringatan
Untuk membuat templat berfungsi dengan baik:
- Edit panggilan ke
LogValidationError
untuk menghapus argumenerrorSourceNodes
opsional danerrorTargetNodes
. - Jika Anda menggunakan properti kustom, terapkan pembaruan yang disebutkan di Menambahkan properti kustom ke diagram dependensi.
- Edit panggilan ke
Edit kode untuk menentukan validasi Anda. Untuk informasi selengkapnya, lihat Validasi Pemrograman.
Untuk menguji ekstensi, lihat Debugging Validasi Lapisan.
Catatan
Metode Anda hanya akan dipanggil dalam keadaan tertentu, dan titik henti tidak akan berfungsi secara otomatis. Untuk informasi selengkapnya, lihat Men-debug Validasi Lapisan.
Untuk menginstal ekstensi di instans utama Visual Studio, atau di komputer lain, temukan file .vsix di direktori bin. Salin ke komputer tempat Anda ingin menginstalnya, lalu klik dua kali. Untuk menghapus instalannya, pilih Kelola Ekstensi pada menu Ekstensi.
Menambahkan Validator Lapisan ke VSIX Terpisah
Jika Anda ingin membuat satu VSIX yang berisi validator lapisan, perintah, dan ekstensi lainnya, kami sarankan Anda membuat satu proyek untuk menentukan VSIX, dan memisahkan proyek untuk handler.
Untuk menambahkan validasi lapisan ke VSIX terpisah
Buat proyek Pustaka Kelas .NET Framework. Proyek ini akan berisi kelas validasi lapisan.
Temukan atau buat Proyek VSIX dalam solusi Anda. Proyek VSIX berisi file yang diberi nama source.extension.vsixmanifest.
Di Penjelajah Solusi, pada menu klik kanan proyek VSIX, pilih Atur sebagai Proyek Startup.
Di source.extension.vsixmanifest, di bawah Aset, tambahkan proyek validasi lapisan sebagai komponen MEF:
Pilih Baru.
Dalam kotak dialog Tambahkan Aset Baru, atur:
Ketik = Microsoft.VisualStudio.MefComponent
Sumber = Proyek A dalam solusi saat ini
Proyeksakan = proyek validator Anda
Anda juga harus menambahkannya sebagai validasi lapisan:
Pilih Baru.
Dalam kotak dialog Tambahkan Aset Baru, atur:
Ketik = Microsoft.VisualStudio.ArchitectureTools.Layer.Validator. Ini bukan salah satu opsi dalam daftar drop-down. Anda harus memasukkannya dari keyboard.
Sumber = Proyek A dalam solusi saat ini
Proyeksakan = proyek validator Anda
Kembali ke proyek validasi lapisan, dan tambahkan referensi proyek berikut:
Referensi Memungkinkan Anda melakukan Microsoft.VisualStudio.GraphModel.dll Membaca grafik arsitektur Microsoft.VisualStudio.ArchitectureTools.Extensibility.CodeSchema.dll Membaca kode DOM yang terkait dengan lapisan Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.dll Membaca model Lapisan Microsoft.VisualStudio.ArchitectureTools.Extensibility Membaca dan memperbarui bentuk dan diagram. System.ComponentModel.Composition Tentukan komponen validasi menggunakan Managed Extensibility Framework (MEF) Microsoft.VisualStudio.Modeling.Sdk.[version] Menentukan ekstensi pemodelan Salin kode contoh di akhir topik ini ke dalam file kelas di proyek pustaka validator untuk berisi kode untuk validasi Anda. Untuk informasi selengkapnya, lihat Validasi Pemrograman.
Untuk menguji ekstensi, lihat Debugging Validasi Lapisan.
Catatan
Metode Anda hanya akan dipanggil dalam keadaan tertentu, dan titik henti tidak akan berfungsi secara otomatis. Untuk informasi selengkapnya, lihat Men-debug Validasi Lapisan.
Untuk menginstal ekstensi di instans utama Visual Studio, atau di komputer lain, temukan file .vsix di direktori bin. Salin ke komputer tempat Anda ingin menginstal VSIX. Klik dua kali file VSIX di Windows Explorer.
Validasi Pemrograman
Untuk menentukan ekstensi validasi lapisan, Anda menentukan kelas yang memiliki karakteristik berikut:
Bentuk keseluruhan deklarasi adalah sebagai berikut:
using System.ComponentModel.Composition; using Microsoft.VisualStudio.ArchitectureTools.Extensibility.CodeSchema; using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer; using Microsoft.VisualStudio.GraphModel; ... [Export(typeof(IValidateArchitectureExtension))] public partial class Validator1Extension : IValidateArchitectureExtension { public void ValidateArchitecture(Graph graph) { GraphSchema schema = graph.DocumentSchema; ... } }
Saat menemukan kesalahan, Anda dapat melaporkannya dengan menggunakan
LogValidationError()
.Peringatan
Jangan gunakan parameter opsional dari
LogValidationError
.
Ketika pengguna memanggil perintah menu Validasi Arsitektur , sistem runtime lapisan menganalisis lapisan dan artefak mereka untuk menghasilkan grafik. Grafik memiliki empat bagian:
Model lapisan solusi Visual Studio yang direpresentasikan sebagai simpul dan tautan dalam grafik.
Kode, item proyek, dan artefak lain yang didefinisikan dalam solusi dan diwakili sebagai simpul, dan tautan yang mewakili dependensi yang ditemukan oleh proses analisis.
Tautan dari node lapisan ke simpul artefak kode.
Simpul yang mewakili kesalahan yang ditemukan oleh validator.
Ketika grafik telah dibangun, metode validasi standar dipanggil. Ketika ini selesai, metode validasi ekstensi yang diinstal dipanggil dalam urutan yang tidak ditentukan. Grafik diteruskan ke setiap ValidateArchitecture
metode, yang dapat memindai grafik dan melaporkan kesalahan apa pun yang ditemukannya.
Catatan
Ini tidak sama dengan proses validasi yang dapat digunakan dalam bahasa khusus domain.
Metode validasi tidak boleh mengubah model lapisan atau kode yang sedang divalidasi.
Model grafik didefinisikan dalam Microsoft.VisualStudio.GraphModel. Kelas utamanya adalah GraphNode dan GraphLink.
Setiap Simpul dan setiap Tautan memiliki satu atau beberapa Kategori yang menentukan jenis elemen atau hubungan yang diwakilinya. Simpul grafik umum memiliki kategori berikut:
Dsl.LayerModel
Dsl.Layer
Dsl.Reference
CodeSchema_Type
CodeSchema_Namespace
CodeSchema_Type
CodeSchema_Method
CodeSchema_Field
CodeSchema_Property
Tautan dari lapisan ke elemen dalam kode memiliki kategori "Represents".
Validasi Penelusuran Kesalahan
Untuk men-debug ekstensi validasi lapisan Anda, tekan CTRL+F5. Instans eksperimental Visual Studio terbuka. Dalam hal ini, buka atau buat model lapisan. Model ini harus dikaitkan dengan kode, dan harus memiliki setidaknya satu dependensi.
Uji dengan Solusi yang berisi Dependensi
Validasi tidak dijalankan kecuali ada karakteristik berikut:
Setidaknya ada satu tautan dependensi pada diagram dependensi.
Ada lapisan dalam model yang terkait dengan elemen kode.
Pertama kali Anda memulai instans eksperimental Visual Studio untuk menguji ekstensi validasi Anda, buka atau buat solusi yang memiliki karakteristik ini.
Jalankan Solusi Bersih sebelum Memvalidasi Arsitektur
Setiap kali Anda memperbarui kode validasi, gunakan perintah Clean Solution pada menu Build di solusi eksperimental, sebelum Anda menguji perintah Validasi. Ini diperlukan karena hasil validasi di-cache. Jika Anda belum memperbarui diagram dependensi pengujian atau kodenya, metode validasi tidak akan dijalankan.
Luncurkan Debugger Secara Eksplisit
Validasi berjalan dalam proses terpisah. Oleh karena itu, titik henti dalam metode validasi Anda tidak akan dipicu. Anda harus melampirkan debugger ke proses secara eksplisit ketika validasi telah dimulai.
Untuk melampirkan debugger ke proses validasi, sisipkan panggilan ke System.Diagnostics.Debugger.Launch()
di awal metode validasi Anda. Saat kotak dialog penelusuran kesalahan muncul, pilih instans utama Visual Studio.
Atau, Anda dapat menyisipkan panggilan ke System.Windows.Forms.MessageBox.Show()
. Saat kotak pesan muncul, buka instans utama Visual Studio dan pada menu Debug klik Lampirkan ke Proses. Pilih proses yang bernama Graphcmd.exe.
Selalu mulai instans eksperimental dengan menekan CTRL+F5 (Mulai tanpa Debugging).
Menyebarkan Ekstensi Validasi
Untuk menginstal ekstensi validasi Anda di komputer tempat versi Visual Studio yang sesuai diinstal, buka file VSIX di komputer target.
Contoh kode
using System;
using System.ComponentModel.Composition;
using System.Globalization;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.CodeSchema;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer;
using Microsoft.VisualStudio.GraphModel;
namespace Validator3
{
[Export(typeof(IValidateArchitectureExtension))]
public partial class Validator3Extension : IValidateArchitectureExtension
{
/// <summary>
/// Validate the architecture
/// </summary>
/// <param name="graph">The graph</param>
public void ValidateArchitecture(Graph graph)
{
if (graph == null) throw new ArgumentNullException("graph");
// Uncomment the line below to debug this extension during validation
// System.Windows.Forms.MessageBox.Show("Attach 2 to GraphCmd.exe with process id " + System.Diagnostics.Process.GetCurrentProcess().Id);
// Get all layers on the diagram
foreach (GraphNode layer in graph.Nodes.GetByCategory("Dsl.Layer"))
{
System.Threading.Thread.Sleep(100);
// Get the required regex property from the layer node
string regexPattern = "^[a-zA-Z]+$"; //layer[customPropertyCategory] as string;
if (!string.IsNullOrEmpty(regexPattern))
{
Regex regEx = new Regex(regexPattern);
// Get all referenced types in this layer including those from nested layers so each
// type is validated against all containing layer constraints.
foreach (GraphNode containedType in layer.FindDescendants().Where(node => node.HasCategory("CodeSchema_Type")))
{
// Check the type name against the required regex
CodeGraphNodeIdBuilder builder = new CodeGraphNodeIdBuilder(containedType.Id, graph);
string typeName = builder.Type.Name;
if (!regEx.IsMatch(typeName))
{
// Log an error
string message = string.Format(CultureInfo.CurrentCulture, Resources.InvalidTypeNameMessage, typeName);
this.LogValidationError(graph, typeName + "TypeNameError", message, GraphErrorLevel.Error, layer);
}
}
}
}
}
}
}