レイヤー図へのカスタム プロパティの追加
Visual Studio Ultimate でレイヤー図の拡張コードを記述するときは、レイヤー図の任意の要素と共に値を格納できます。 値は、図が保存され、再び開かれたときに保持されます。 これらのプロパティは、ユーザーが表示して編集できるように、[プロパティ] ウィンドウに表示することもできます。 たとえば、ユーザーが各レイヤーに正規表現を指定できるようにすることや、各レイヤーのクラスの名前がユーザーが指定したパターンに準拠していることを確認するための検証コードをユーザーが記述できるようにすることができます。
ユーザーに表示されないプロパティ
レイヤー図の任意の要素に値をアタッチするコードが必要なだけの場合、MEF コンポーネントを定義する必要はありません。 ILayerElement には Properties という名前のディクショナリがあります。 マーシャリング可能な値を任意のレイヤー要素のディクショナリに単純に追加します。 これらの値は、レイヤー図の一部として保存されます。 詳細については、「プログラム コードにおけるレイヤー モデル内の移動およびレイヤー モデルの更新」を参照してください。
ユーザーが編集できるプロパティ
最初の準備
重要
プロパティが表示されるようにするには、レイヤーのプロパティが表示されるようにする必要のある各コンピューターで、次の変更を行う必要があります。
-
[管理者として実行] を使用して、メモ帳を実行します。%ProgramFiles%\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Architecture Tools\ExtensibilityRuntime\extension.vsixmanifest を開きます。
-
Content 要素内で、次を追加します。
<MefComponent>Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.Provider.dll</MefComponent>
-
Windows の [スタート] メニューで、[Microsoft Visual Studio 2012]、[Visual Studio Tools] の順にクリックし、[開発者コマンド プロンプト] を開きます。
次のように入力します。
devenv /rootSuffix /updateConfiguration
devenv /rootSuffix Exp /updateConfiguration
-
Visual Studio を再起動します。
コードが VSIX プロジェクトに含まれていることを確認する
プロパティがコマンド、ジェスチャ、または検証プロジェクトの一部である場合、何も追加する必要はありません。 カスタム プロパティのコードは、MEF コンポーネントとして定義された Visual Studio 機能拡張プロジェクトで定義する必要があります。 詳細については、「レイヤー図へのコマンドおよびジェスチャの追加」または「レイヤー図へのカスタム アーキテクチャ検証の追加」を参照してください。
カスタム プロパティを定義する
カスタム プロパティを作成するには、次のようなクラスを定義します。
[Export(typeof(IPropertyExtension))]
public class MyProperty
: PropertyExtension<ILayerElement>
{
// Implement the interface.
}
ILayerElement のプロパティまたはその任意の派生クラスのプロパティを定義できます。これには、次のものが含まれます。
ILayerModel - モデル
ILayer - 各レイヤー
ILayerDependencyLink - レイヤー間のリンク
ILayerComment
ILayerCommentLink
カスタム プロパティを表示するには
重要
カスタム プロパティは、モデリング プロジェクトの読み込み前にアーキテクチャ エクスプローラーが開いている場合にのみ表示されます。カスタム プロパティを表示するためには、アーキテクチャ エクスプローラーを開いてから Visual Studio を停止して再起動することが必要になる場合があります。[アーキテクチャ] メニューの [ウィンドウ] をクリックし、[アーキテクチャ エクスプローラー] をクリックします。
カスタム プロパティをテストするには、F5 キーを押して、Visual Studio の実験的なインスタンスを開始します。 適切なレイヤー要素の例を作成して選択します。 [プロパティ] ウィンドウにカスタム プロパティが表示されます。
例
次のコードは、標準的なカスタム プロパティ記述子です。 この例では、Boolean プロパティがレイヤー モデル (ILayerModel) で定義されており、ユーザーはこれを使用してカスタム検証メソッドに値を提供できます。
using System;
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer;
namespace MyNamespace
{
/// <summary>
/// Custom properties are added to the Layer Designer via a custom
/// Property Descriptor. We have to export this Property Descriptor
/// using MEF to make it available in the Layer Designer.
/// </summary>
[Export(typeof(IPropertyExtension))]
public class AllTypesMustBeReferencedProperty
: PropertyExtension<ILayerModel>
{
/// <summary>
/// Each custom property must have a unique name.
/// Usually we use the full name of this class.
/// </summary>
public static readonly string FullName =
typeof(AllTypesMustBeReferencedProperty).FullName;
/// <summary>
/// Construct the property. Notice the use of FullName.
/// </summary>
public AllTypesMustBeReferencedProperty()
: base(FullName)
{ }
/// <summary>
/// The display name is shown in the Properties window.
/// We therefore use a localizable resource.
/// </summary>
public override string DisplayName
{
get { return Strings.AllTypesMustBeReferencedDisplayName; }
}
/// <summary>
/// Description shown at the bottom of the Properties window.
/// We use a resource string for easier localization.
/// </summary>
public override string Description
{
get { return Strings.AllTypesMustBeReferencedDescription; }
}
/// <summary>
/// This is called to set a new value for this property. We must
/// throw an exception if the value is invalid.
/// </summary>
/// <param name="component">The target ILayerElement</param>
/// <param name="value">The new value</param>
public override void SetValue(object component, object value)
{
ValidateValue(value);
base.SetValue(component, value);
}
/// <summary>
/// Helper to validate the value.
/// </summary>
/// <param name="value">The value to validate</param>
private static void ValidateValue(object value)
{ }
public override Type PropertyType
{ get { return typeof(bool); } }
/// <summary>
/// The segment label of the properties window.
/// </summary>
public override string Category
{
get
{
return Strings.AllTypesMustBeReferencedCategory;
}
}
}
}