Pergunta

Eu percebo já houve uma série de posts sobre design de n-tier e isso poderia ser me pensando sobre as coisas e andando em círculos, mas eu tenho tudo para mim confuso agora e gostaria de obter alguma clareza da comunidade por favor.

Eu estou tentando separar um projeto que eu criei, (e não projetar arquitectonicamente muito bem para começar), para fora em diferentes camadas (cada um em seu próprio projeto):

  • UI
  • Business Objects
  • Logic / Negócios
  • DAL

O UI só deve chamar a camada de lógica de obter seu material

O Business Objects não deve chamar ou ter referências a qualquer outra coisa, ser apenas uma forma de armazenar os dados

O Logic / BUSINESS camada deve conter todos os métodos para obter, criar, atualizar, delete (CRUD) objetos no sistema e teria referências a tanto o BO eo DAL. Seria aplicar a lógica de negócios para as operações em seguida, delegar a CRUD real para o DAL.

O DAL seria apenas fazer as operações CRUD no DB. Ele teria uma referência ao BO de como ele iria devolvê-los para a Obtém etc.

A minha pergunta é se as aulas de lógica única chamar sua classe DAL equivalente e apenas chamar as classes de lógica em vez disso? Em outras palavras, a classe CompanyLogic só deve chamar classe CompanyDAL. Então, se ele queria ficar objeto que um cliente por ID chamaria ClientLogic.GetClientByID(int) vez do ClientDAL.GetClientByID(int).

A razão que eu pensei que talvez deveria ficar na sua própria camada foi que:

  1. Parece para afrouxar o acoplamento entre projetos

  2. E a lógica, se a obtenção de um objeto cliente tinha alguma validação lógica nele (possivelmente não o melhor exemplo, mas espero que obtenha o ponto transversalmente).

EDIT:

Eu não tenho certeza se é ruim projeto por mim, mas no momento em que a camada de negócios tem um número de classes, incluindo ClientBULL e CompnayBULL, ambas as classes tem uma chamada para um outro. Eu uso uma interface para cada classe e tem uma fábrica para construir os objetos para tentar reduzir qualquer acoplamento, mas eles não podem existir um sem o outro agora devido a chamar métodos em ambas as classes. Será esta uma má idéia?

Foi útil?

Solução

Bem, aqui está meus comentários sobre seu projeto:

  • Logic é um nome ruim para o que é essencialmente uma camada atribuída a persistência abstrato. Eu provavelmente chamá-lo de "Repository" ou "Persistência" ou DAO (objetos de acesso a dados) em vez de "Logic", que é ambígua e poderia absolutamente média qualquer .

  • Se você realmente quer dissociar sua camada de negócio de sua DAL, sua camada de lógica só deve aceitar interfaces para a DAL, e não as classes DAL concretas.

  • Há duas escolas de pensamento a respeito de onde a validação deve residir. Alguns são completamente bem com a validação sentado na camada de interface do usuário; outros preferem lançar exceções ou passar mensagens a partir da camada de negócios. Qualquer maneira você vai, apenas ser consistente, não faça validações duplicadas em vários lugares, e você vai ficar bem.

  • Vá em frente e tentar codificá-lo seria provavelmente o melhor conselho que eu poderia dar-lhe. É bem e muito bem pensar nisso, mas em um ponto que você precisa para vê-lo enquanto você está programando-lo e só então peculiaridades sutis e armadilhas revelar-se. Seja qual for protótipos que você pode vir até com definitivamente vai ser valiosa para a direção o seu desenvolvimento e design leva você.

Goodluck!

Atualizar

Re sua edição: Dentro do mesmo namespace ou montagem, chamadas para classes concretas são definitivamente bem. Eu acho que vai ser excessivamente complicado para você precisa colocar as interfaces para a lógica de negócios? - Quero dizer que há mais de um conjunto de regras que você deve seguir

Eu sou um crente de manter as coisas simples e seguindo YAGNI . Não faça uma interface até que não haja mais de duas classes que vão implementar / já implementar essa interface (a DAL é sempre uma exceção a esta embora).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top