Pergunta

Suponha que eu estou desenvolvendo uma aplicação para um distribuidor do produto em C #.

O distribuidor faz as seguintes 3 tipos de transações:

(1) Recuo

(2) vender

(3) Stock

Eu estou projetando minhas aulas da seguinte forma:

public abstract class Transaction
{
}

public class Indent : Transaction
{
}

public class Sell : Transaction
{
}    

public class Stock : Transaction
{
}

Agora, se eu quiser salvar esses três tipos de informações em três mesas separadas, então, como eu deve projetar minha camada DA?

Eu deveria construir as classes de DA separadas como

(1) IndentDA
(2) SellDA
(3) StockDA

ou um único TransactionDA classe e executar operações CRUD, verificando seus tipos usando operadores as/is?

Ou o que mais posso fazer? Alguma sugestão?

Foi útil?

Solução

Em primeiro lugar, se você criou uma única classe TransactionDA e verificado tipos dentro da classe para executar operações CRUD, você estaria violando a Open / Princípio Closed , então eu definitivamente não ir por esse caminho.

Como para obter sugestões sobre como realizar construir o seu DAL, gostaria de sugerir seguindo alguns posts sobre as pessoas muito mais inteligente do que eu sobre o que eles pensam sobre este tema.

Repository é o novo Singleton

Repository is Dead: Viva Repository

Noite dos Repositórios Vida

A conversa continua, creio eu, mas isso deve começar.

Outras dicas

Gostaria de usar um ORM como NHibernate e usar as suas capacidades de herança multi-mesa e, em seguida, não precisa se preocupar sobre ele próprio.

Gostaria de usar subtipos entidade aqui. Criar uma tabela para as transações (e como um cartaz anterior disse, talvez um termo diferente seria melhor) e armazenar tudo o que é comum em lá. Em seguida, criar uma tabela "sub-tipo" para cada especialização. Estas tabelas subtipo deve ter a mesma chave primária como a tabela principal (a entidade "forte") e os campos que são únicas para que a especialização particular. Cada subtipo está relacionado com a entidade forte de uma forma um-para-um, com a participação opcional no final subtipo e participação necessária no final forte entidade.

Então, para fazer a consulta mais fácil, definir uma visão de que (exterior) se junta a entidade forte com todos os subtipos da entidade para que você possa facilmente "ver" tudo.

Aqui está um exemplo de como configurar isso simples (e comum):

create table Employee (
  eid        int primary key,
  first_name text,
  last_name  text not null
)

create table Salaried (
  eid             int primary key,
  annualSalaryUSD money not null
)

create table Hourly (
  eid             int primary key,
  hourlyRateUSD   money not null
)  

Se você sabe que seus dados estão indo em três mesas separadas, então eu normalmente teria três classes DA separadas.

No entanto, se suas tabelas são praticamente exatamente o mesmo, então você poderia genericize o TransactionDA e simplificar a sua camada de dados. Eu só faria isso se você sabe que você vai ter alto volume de transações e vão ser separar suas tabelas em diferentes arquivos ou algo, caso contrário eu provavelmente apenas coisas simplificar e combinar tudo.

Não tente criar uma TransactionDA a menos que todos os seus tipos de transações separadas são extremamente similar.

Você pode usar injeção de dependência, crie uma classe DA para cada um e tê-los todos implementam a mesma interface ITransactionDA com suas operações CRUD.

public interface ITransactionDA
{
  void Read();
  void Update();
...
}

public class StockDA : ITransactionDA
{
  //implement interface methods
}

Stock stock = new Stock(new StockDA());

Eu vou fazer algo assim

public abstract class DistributerTransaction
{
    DistributerDA dataaccess;
}
public class Indent : DistributerTransaction
{
}
public class Sell : DistributerTransaction
{
}
public class Stock : DistributerTransaction
{
}

public abstract class DistributerDA
{
   /*Read();
     Update();*/
}
public class IndentDA : DistributerDA
{
}
public class SellDA : DistributerDA
{
}
public class StockDA : DistributerDA
{
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top