Este artigo foi traduzido por máquina.

Caixa de ferramentas

O padrão de registro Active, programação orientada A aspecto

Scott Mitchell

Todos os preços confirmados em 29 de dezembro de 2008 e estão sujeitas a alterações.As opiniões expressas nesta coluna são exclusivas do autor e não refletem necessariamente as opiniões da Microsoft.

Conteúdo

Implementar o padrão de registro Active em seu aplicativo .NET
Programação orientada A aspecto do .NET Framework

Implementar o padrão de registro Active em seu aplicativo .NET

O padrão de registro ativo é normalmente usado em aplicativos orientados a dados para modelar uma tabela de banco de dados ou modo de exibição em termos de uma classe, onde uma linha de tabela de banco de dados é modelada por uma instância da classe.Nesse padrão, propriedades a classe mapear para colunas da tabela de banco de dados correspondente.

Métodos de instância da classe executar operações em um registro de banco de dados, enquanto os métodos estáticos trabalharem com a tabela inteira.Por exemplo, se o banco de dados contiver uma tabela denominada funcionários com as colunas EmployeeId como uniqueidentifier, nome como um nvarchar(50) e salário como um dinheiro, para implementar o padrão de registro ativo você poderia criar uma classe denominada funcionários com propriedades denominadas EmployeeId, nome e salário.A classe de funcionário incluiria métodos de instância, como criar, salvar e excluir e pode incluem métodos estáticos, como DeleteAll, localizar e FindAll.

a Figura 1 mostra o padrão de registro ativo.Ele oferece uma sintaxe simples e intuitiva para trabalhar com dados e é o padrão usado por muitos relacionais do objeto mappers (O/RM).

Figura 1 padrão de registro Active em ação

// Add Andrew Fuller as a new employee  
Employee emp = new Employee();
emp.Name = "Andrew Fuller";
emp.Salary = 50000.00M;
emp.Create();

// Give a 10% raise to all employees 
Employee[] allEmployees = Employee.FindAll();
foreach (Employee current in allEmployees)
{
    current.Salary *= 1.10M;
    current.Save();
} 

O projeto Castle ActiveRecord (versão 1.0, RC3) oferece uma maneira rápida e fácil para implementar o padrão de registro ativo para aplicativos do Microsoft com base no .NET Framework. Ele é criado sobre NHibernate, que é uma ferramenta de O/RM gratuita, aberto e foi revisado na Coluna de caixa de ferramentas de outubro de 2006.

Uma das desvantagens de NHibernate é que ele tem um pouco de uma curva de aprendizagem steep e requer que o desenvolvedor crie e mantenha os arquivos de mapeamento XML que unir as tabelas do banco de dados, colunas e relações com as classes e propriedades em que o aplicativo. O projeto de ActiveRecord API encapsula grande parte essa complexidade usando atributos .NET e torna a implementar o padrão de registro ativo fácil.

Para começar, baixe o pacote de instalação da página do projeto. Isso instala os assemblies ActiveRecord e NHibernate e torna-los visíveis para o Visual Studio; adicionar esses assemblies ao seu projeto. Em seguida, crie as classes em seu aplicativo que será usado o padrão de registro ativo para uma tabela de banco de dados do modelo.

Este é o código para a classe funcionário mencionado na A Figura 1 :

[ActiveRecord]
public class Employee : ActiveRecordBase<Employee>
{
    [PrimaryKey] public Guid EmployeeId { get; set; }
    [Property] public string Name { get; set; }
    [Property] public decimal Salary { get; set; }
}

Observe que a classe de funcionário estende a classe ActiveRecordBase e usa atributos ao sinalizador de quais propriedades mapeiam para colunas na tabela de banco de dados e a coluna que serve como a chave primária. A classe de ActiveRecordBase define métodos de instância, como criar e salvar e métodos estáticos incluindo Find, FindAll e DeleteAll.

Você pode fornecer mais detalhes sobre cada membro da classe de funcionário, passando nos parâmetros através de atributos PrimaryKey e propriedades, incluindo o tamanho da seqüência de caracteres colunas, se a coluna requer valores exclusivos, se a coluna pode ser atribuída um valor NULL do banco de dados e se deseja ignorar a coluna ao inserir ou atualizar uma instância de classe.

Junto com a criação da classe de funcionários, você também precisará definir algumas configurações de configuração, como a seqüência de conexão de banco de dados e algumas poucas opções específicas de NHibernate. Mas não há necessidade de escrever nenhum código de acesso a dados. Que é realizado para você automaticamente pelo projeto de ActiveRecord e NHibernate. Na verdade, você nem precisa ter criado as tabelas do banco de dados neste ponto, como o projeto ActiveRecord pode automaticamente gerar as tabelas com base nas classes que você criou.

A sintaxe do atributo do projeto ActiveRecord também é usada para estabelecer relacionamentos entre classes. Por exemplo, os atributos HasMany e BelongsTo podem ser usados em uma classe pai e filho, respectivamente, para indicar uma relação um-para-muitos. Imagine que o modelo de dados foi expandido para incluir uma tabela de departamento com colunas DepartmentId e o nome e uma coluna DepartmentId na tabela Funcionários estabelecer um relacionamento um-para-muitos entre departamentos e funcionários. Esse relacionamento deve ser modelado no aplicativo, adicionando uma classe de departamento e atualizar a classe de funcionários para incluir uma nova propriedade (consulte a Figura 2 ).

A Figura 2 adicionando a classe de funcionários

[ActiveRecord]
public class Department : ActiveRecordBase<Department>
{
    [PrimaryKey] public int DepartmentId { get; set; }
    [Property] public string Name { get; set; }
    [HasMany(typeof(Employee))] public IList Employees { get; set; }
}

[ActiveRecord]
public class Employee : ActiveRecordBase<Employee>
{
    ...
    [BelongsTo("DepartmentId")] public Department Department { get; set; }
}

Observe que a classe de departamento possui uma propriedade de funcionários, que retorna o conjunto de objetos de funcionário para uma instância específica do departamento. Da mesma forma, o objeto de funcionários possui uma propriedade de departamento que retorna informações sobre o departamento ao qual o funcionário pertence.

O projeto ActiveRecord torna mais fácil começar a criação de arquitetura do seu aplicativo na parte superior de uma estrutura comprovada, NHibernate. Em alguns minutos você pode criar classes que usam o padrão de registro ativo sem precisar de mestre de sintaxe de configuração XML do NHibernate.

Preço: Livre, aberto.

castleproject.org/ActiveRecord

Programação orientada A aspecto do .NET Framework

Separação de preocupações é um princípio central da engenharia de software que incentiva a separar os recursos do aplicativo e a funcionalidade em módulos não-sobreposição. Cada paradigma de programação tem seus próprio técnicas para encorajando isso. Procedimentos linguagens de programação permitem que os desenvolvedores encapsulam funcionalidades nas sub-rotinas; linguagens de programação orientada a objeto usam classes.

Segurança, log e armazenamento em cache são exemplos das preocupações que normalmente se aplicam a vários módulos e, quando implementadas, resultam em código espalhado por esses módulos para o qual as regras se aplicam. Esses tipos de problemas são considerados entre recortando e são chamados de aspectos.

Programação orientada a aspecto (AOP) é um paradigma de programação que se concentra no tratamento a separação de preocupações abrangentes. AOP permite aos desenvolvedores criar aspectos em um único módulo e, em seguida, especificar quando essas executar — anterior à execução de um método, quando um método for concluído com sucesso e assim por diante.

Por exemplo, se com um desenvolvedor pode criar um aspecto que é executado antes para execução do método e verifica que o usuário pertence a uma função específica e, em seguida, especifica a quais métodos o aspecto AOP aplicará. Como resultado, sempre que um desses métodos especificados estiver prestes a ser executada durante o tempo de execução, o código de aspecto correspondente executa pela primeira vez. AOP costuma ser implementada por meio de código combinando, que envolve injetando o código de aspecto para os pontos apropriados no código do aplicativo — no final de tempo de compilação ou durante o tempo de execução.

Check-out PostSharp (versão 1.5), um livre, biblioteca de código aberto criado por Gael Fraiteur que você pode usar para implementar as técnicas de AOP no .NET Framework. Em seu núcleo, PostSharp analisa e transforma .NET assemblies, permitindo o código combinando necessários para implementar AOP.

Criado sobre esse principal é PostSharp Laos, um sistema orientada a aspecto simples que permite aos desenvolvedores criar e usar aspectos em termos de atributos personalizados. Os aspectos, em seguida, podem ser aplicados às classes ou métodos por decoração-los com o atributo personalizado. Como alternativa, aspectos podem ser aplicados a todas as classes ou métodos que possuem um determinado padrão nomeação por meio de sintaxe no arquivo de AssemblyInfo do projeto.

a Figura 3 mostra um exemplo de um aspecto PostSharp para notificação de erros. Esse aspecto estende o OnExceptionAspect, que significa que o aspecto possa executar em resposta a uma exceção não tratada, talvez enviando por email um detalhes do administrador de exceção. Esse aspecto pode ser aplicado a um método particular decoração-lo com o atributo OnException, conforme mostrado aqui:

[OnException("admin@contoso.com")]
private void MyMethod()
{
    // ...
}

A Figura 3 A PostSharp taxa para notificação de erros

public class OnExceptionAttribute : OnExceptionAspect
 {
    public string ToAddress { get; set; }

    public OnExceptionAttribute(string to)
    {
        ToAddress = to;
    }

    public override void OnException(MethodExecutionEventArgs e)
    {
        // TODO: Send ToAddress an e-mail detailing the exception details.
        // Exception details available in the MethodExecutionEventArgs object
    }
}

Imediatamente depois do código de ter sido compilado, PostSharp modifica o código de IL de MyMethod, envolvendo o existente código com um try... catch com uma chamada ao método OnException dentro do bloco catch.Como resultado, o aspecto OnException é chamado sempre que houver uma exceção não tratada no MyMethod.

Você encontrará extensa documentação no site da Web PostSharp, juntamente com um quadro de mensagem útil.Há também criados pela comunidade plug-ins, bibliotecas e outras ferramentas que utilizam ou estendem PostSharp.

Preço:Livre, aberto.

postsharp.org

Envie suas dúvidas e comentários paratoolsmm@Microsoft.com.

Scott Mitchell, autor de diversos livros e fundador da4GuysFromRolla.com, é um MVP que tem trabalhado com tecnologias Web da Microsoft desde 1998.Scott é um consultor independente, instrutor e escritor.Entrar noContato com ele pelo email Mitchell@4guysfromrolla.comou pelo seu blog emScottOnWriting.NET.