Adicionar propriedades personalizadas a um diagrama de camada

Quando você escreve o código de extensão para diagramas da camada em Visual Studio Ultimate, você pode armazenar valores com qualquer elemento em um diagrama de camada.Os valores persistirão quando o diagrama é salvo e reaberto.Você também pode fazer essas propriedades aparecer na janela de Propriedades de modo que os usuários possam as consulte e editar.Por exemplo, você pode permitir que os usuários especificar uma expressão regular para cada camada, e escreve código de validação para verificar que os nomes das classes em cada camada se conformassem ao padrão especificado pelo usuário.

Propriedades não visíveis ao usuário

Se você deseja apenas o código para anexar valores a qualquer elemento em um diagrama de camadas, você não precisa definir um componente de MEF.Há um dicionário chamado Properties em ILayerElement.Simplesmente adicionar valores marshalable ao dicionário de qualquer elemento de camada.Serão salvos como parte do diagrama de camada.Para obter mais informações, consulte Navegando e atualizar modelos de camada no código de programa.

Propriedades que o usuário pode editar

Preparação inicial

Observação importanteImportante

Para fazer propriedades aparecer, você deve fazer a seguinte alteração em cada computador onde você quer propriedades de camada para ser visível.

  1. Execução Bloco De Notas usando Executar como administrador.%ProgramFiles%\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Architecture Tools\ExtensibilityRuntime\extension.vsixmanifestaberto

  2. Dentro do elemento de Content , adicione:

    <MefComponent>Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.Provider.dll</MefComponent>
  3. No menu Iniciar do Windows, abaixo Microsoft Visual Studio 2012, Visual Studio Tools, abra Prompt de comando do desenvolvedor.

    Entre:

    devenv /rootSuffix /updateConfiguration

    devenv /rootSuffix Exp /updateConfiguration

  4. Reinicie o Visual Studio.

Certifique-se de que seu código está em um projeto de VSIX

Se a propriedade for parte de um comando, um gesto, ou um projeto de validação, você não precisa adicionar qualquer coisa.O código para a propriedade personalizada deve ser definido em um projeto de extensibilidade do Visual Studio definido como um componente de MEF.Para obter mais informações, consulte Adicionando comandos e gestos para diagramas de camada ou Adicionar validação personalizada da arquitetura a diagramas de camada.

Defina a propriedade personalizada

Para criar uma propriedade personalizada, defina uma classe como esta:

[Export(typeof(IPropertyExtension))]
public class MyProperty 
      : PropertyExtension<ILayerElement>
{
  // Implement the interface.
}

Você pode definir propriedades em ILayerElement ou algumas de suas classes derivadas, que incluem:

  • ILayerModel - o modelo

  • ILayer - cada camada

  • ILayerDependencyLink - links entre camadas

  • ILayerComment

  • ILayerCommentLink

Para consultar suas propriedades personalizadas

Observação importanteImportante

As propriedades personalizadas aparecem somente se a arquitetura Explorer estiver aberta antes que você carregue o projeto modelando.Talvez você precise arquitetura aberta Explorer e para interromper e reiniciar no Visual Studio para ver propriedades personalizadas.No menu de Arquitetura , escolha Janelas, Arquitetura Explorer.

Para testar suas propriedades personalizadas, pressione F5 para iniciar uma instância de avaliação do Visual Studio.Crie um exemplo de elemento de nível apropriado, e selecioná-lo.Você verá sua propriedade personalizada na janela propriedades.

Exemplo

O código a seguir é um descritor personalizado típico da propriedade.Define uma propriedade booleana no modelo de camada (ILayerModel) que permite o usuário fornecer valores para um método de validação personalizada.

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;
      }
    }
  }
}

Consulte também

Conceitos

Estendendo os diagramas de camada