Propriedades calculadas e de armazenamento personalizado
Todas as propriedades de domínio em um idioma específico do domínio (DSL) podem ser exibidas para o usuário no diagrama e no explorer seu idioma e podem ser acessadas pelo código do programa. No entanto, propriedades diferem na maneira como que seus valores são armazenados.
Tipos de propriedades do domínio
Na definição de DSL, você pode definir o tipo de uma propriedade de domínio, conforme listado na tabela a seguir:
Tipo de propriedade de domínio |
Descrição |
---|---|
Padrão (padrão) |
Uma propriedade de domínio que é salvo na armazenar e serializado para o arquivo. |
Calculado |
Uma propriedade de domínio somente leitura que não é salva no armazenamento, mas é calculada a partir de outros valores. Por exemplo, Person.Age pode ser calculado a partir Person.BirthDate. Você deve fornecer o código que executa o cálculo. Normalmente, você pode calcular o valor de outras propriedades do domínio. No entanto, você também pode usar recursos externos. |
Armazenamento personalizada |
Uma propriedade de domínio que não é salvo diretamente no armazenamento, mas pode ser tanto get e set. Você deve fornecer os métodos de obtém e definir o valor. For example, Person.FullAddress could be stored in Person.StreetAddress, Person.City, and Person.PostalCode. Você também pode acessar recursos externos, por exemplo, para obter e definir valores de um banco de dados. Seu código não deve definir os valores no armazenamento quando Store.InUndoRedoOrRollback é verdadeiro. Consulte transações e Setters personalizado. |
Fornecendo o código para uma propriedade calculada ou personalizado de armazenamento
Se você definir o tipo de uma propriedade de domínio para o armazenamento de personalizado ou calculado, você precisa fornecer métodos de acesso. Quando você constrói sua solução, um relatório de erro dirá o que é necessário.
Para definir uma calculado ou propriedade de armazenamento personalizada
Na DslDefinition.dsl, selecione a propriedade de domínio no diagrama ou em Explorer DSL.
No Propriedades janela, defina a tipo campo para calculado ou Armazenamento personalizado.
Certifique-se de que você definiu também sua tipo de que você deseja.
Clique em Transformar todos os modelos de na barra de ferramentas do Solution Explorer.
Sobre o Build menu, clique em Build Solution.
A seguinte mensagem de erro: "YourClass não contém uma definição para GetYourProperty."
Clique duas vezes a mensagem de erro.
Dsl\GeneratedCode\DomainClasses.cs ou DomainRelationships.cs é aberto. Acima da chamada do método realçada, um comentário solicita que você fornecer uma implementação de GetYourProperty().
Dica
Este arquivo é gerado a partir de DslDefinition.dsl.Se você editar esse arquivo, suas alterações serão perdidas na próxima vez que você clicar em Transformar todos os modelos de.Em vez disso, adicione o método exigido em um arquivo separado.
Crie ou abra um arquivo de classe em uma pasta separada, por exemplo CustomCode\YourDomainClass. cs.
Certifique-se de que o espaço para nome é o mesmo, como no código gerado.
No arquivo de classe, escreva uma implementação parcial da classe de domínio. Na classe, escrever uma definição para a ausência de obter método semelhante ao exemplo a seguir:
namespace Company.FamilyTree { public partial class Person { int GetAgeValue() { return System.DateTime.Today.Year - this.BirthYear; } } }
Se você definir tipo para Armazenamento personalizado, você também terá que fornecer um Set método. Por exemplo:
void SetAgeValue(int value) { if (!Store.InUndoRedoOrRollback) this.BirthYear = System.DateTime.Today.Year - value; }
Seu código não deve definir os valores no armazenamento quando Store.InUndoRedoOrRollback é verdadeiro. Consulte transações e Setters personalizado.
Compile e execute a solução.
Teste a propriedade. Certifique-se de que você tente Desfazer e Refazer.
Transações e Setters personalizado
No método conjunto da propriedade personalizada de armazenamento, você não precisará abrir uma transação, porque o método é chamado geralmente dentro de uma transação ativa.
No entanto, o método Set também pode ser chamado se o usuário invoca desfazer ou refazer, ou se uma transação está sendo revertida. Quando InUndoRedoOrRollback for true, o método Set deve se comportar da seguinte maneira:
Ele não deve fazer alterações no armazenamento, como, por exemplo, atribuindo valores a outras propriedades do domínio. O Gerenciador de desfazer definirá seus valores.
No entanto, ele deve atualizar qualquer recursos externos, como, por exemplo, banco de dados ou o conteúdo do arquivo ou objetos fora do armazenamento. Isso irá assegurar que eles são mantidos no synchronism com os valores no armazenamento.
Por exemplo:
void SetAgeValue(int value)
{
// If we are in Undo, no changes to Store objects:
if (!this.Store.InUndoRedoOrRollback)
{
this.BirthYear = System.DateTime.Today.Year - value;
}
// But always update external objects:
System.IO.File.WriteAllText(AgeFile, value);
}
Para obter mais informações sobre transações, consulte Navegando e atualizando um modelo no código do programa.
Consulte também
Referência
Propriedades de propriedades de domínio