Propriedades de armazenamento calculadas e personalizadas
Todas as propriedades de domínio em uma DSL (linguagem específica de domínio) podem ser exibidas para o usuário no diagrama e no gerenciador de linguagem. No entanto, as propriedades diferem na forma como seus valores são armazenados.
Tipos de propriedades de domínio
Na Definição de DSL, você pode definir o tipo de propriedade de domínio, conforme listado na seguinte tabela:
Tipo de propriedade de domínio | Descrição |
---|---|
Standard (padrão) | Uma propriedade de domínio salva no repositório e serializada no arquivo. |
Calculadas | Uma propriedade de domínio somente leitura que não é salva no repositório, mas é calculada com base em outros valores. Por exemplo, Person.Age pode ser calculado com base em Person.BirthDate . Você precisa fornecer o código que executa o cálculo. Normalmente, você calcula o valor de outras propriedades de domínio. No entanto, também é possível utilizar recursos externos. |
Armazenamento personalizado | Uma propriedade de domínio que não é salva diretamente no repositório, mas pode ser do tipo obter e definir. Você precisa fornecer os métodos que obtêm e definem o valor. Por exemplo, Person.FullAddress pode ser armazenado em Person.StreetAddress , Person.City e Person.PostalCode . Você também pode acessar recursos externos, por exemplo, para obter e definir valores de um banco de dados. O código não deverá definir valores no repositório quando Store.InUndoRedoOrRollback for verdadeiro. Consulte Transações e Setters Personalizados. |
Fornecendo código para uma propriedade de armazenamento
Se você definir o tipo de propriedade de domínio como armazenamento calculado ou personalizado, precisará fornecer métodos de acesso. Quando você cria sua solução, um relatório de erro informa o que é necessário.
Para definir uma propriedade de armazenamento calculada ou personalizada
Em DslDefinition.dsl, selecione a propriedade de domínio no diagrama ou no Gerenciador de DSL.
Na janela Propriedades, defina o campo Tipo como Armazenamento Calculado ou Personalizado.
Verifique se você também definiu seu Tipo para o que você deseja.
Selecione Transformar Todos os Modelos na barra de ferramentas do Gerenciador de Soluções.
No menu Build, selecione Compilar Solução.
Você recebe a seguinte mensagem de erro: "<YourClass> não contém uma definição para Get<YourProperty>".
Clique duas vezes na mensagem de erro.
Dsl\GeneratedCode\DomainClasses.cs ou DomainRelationships.cs é aberto. Acima da chamada de método realçada, um comentário solicita que você forneça uma implementação para Get<YourProperty>().
Observação
Esse arquivo é gerado a partir de DslDefinition.dsl. Se você editar o arquivo, suas alterações serão perdidas na próxima vez que você selecionar Transformar Todos os Modelos. Em vez disso, adicione o método necessário em um arquivo separado.
Crie ou abra um arquivo de classe em uma pasta separada, por exemplo CustomCode\<YourDomainClass>.cs.
Verifique se o namespace é o mesmo que no código gerado.
No arquivo de classe, escreva uma implementação parcial da classe de domínio. Na classe, escreva uma definição para o método
Get
ausente que se assemelhe ao seguinte exemplo:namespace Company.FamilyTree { public partial class Person { int GetAgeValue() { return System.DateTime.Today.Year - this.BirthYear; } } }
Se você definir Tipo como Armazenamento Personalizado, também precisará fornecer um método
Set
. Por exemplo:void SetAgeValue(int value) { if (!Store.InUndoRedoOrRollback) this.BirthYear = System.DateTime.Today.Year - value; }
O código não deverá definir valores no repositório quando
Store.InUndoRedoOrRollback
for verdadeiro. Consulte Transações e Setters Personalizados.Compile e execute a solução.
Teste a propriedade. Certifique-se de tentar Desfazer e Refazer.
Transações e Setters Personalizados
No método set
da propriedade Armazenamento Personalizado, você não precisa abrir uma transação. O método geralmente é chamado dentro de uma transação ativa.
No entanto, o método set
também poderá ser chamado se o usuário invocar Desfazer ou Refazer ou se uma transação estiver sendo revertida. Quando InUndoRedoOrRollback for true, seu método set
deverá se comportar da seguinte maneira:
Ele não deve fazer alterações no repositório, como atribuir valores a outras propriedades de domínio. O gerenciador de desfazer define seus valores.
No entanto, ele deve atualizar todos os recursos externos, como conteúdo de banco de dados ou arquivo, ou objetos fora do repositório. Essa abordagem garante que eles sejam mantidos em sincronização com os valores no repositório.
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 Navegar e atualizar um modelo no código do programa.