Pergunta

Em teoria em arquitetura em camadas que você pode ter vários módulos na mesma camada. Pode este módulos de referência cruzada para o outro? Será que é possível tecnicamente, por exemplo. usando .NET?

Foi útil?

Solução

É certamente possível fazê-lo, basta ter cuidado para não introduzir quaisquer dependências cíclicas entre os módulos. Em geral, módulos a uma dada camada única deve depender de outros módulos a partir da mesma camada ou das camadas abaixo dela. Módulos não devem estar cientes das camadas acima deles.

Se você quiser fazer isso ainda mais rigorosas, então você também pode dependências limite para outros módulos da mesma ou de outras camadas imediatamente abaixo do atual.

Mantendo a interface exposta a um mínimo, por exemplo, expondo apenas um conjunto de interfaces públicas, objetos de valor, e exceções é sempre uma boa idéia. Você pode usar recursos de controle de acesso da linguagem (ou seja, / pacote privados / públicos) a visibilidade limite de internos do módulo de derramar em outras camadas.

Outras dicas

Tecnicamente, você pode cross-referência em qualquer direção que você quer em .NET (não existem limitações técnicas para a DAL para fazer referência a um componente de interface do usuário, mesmo que ele não pode ser uma boa idéia). Não vejo problemas com referência módulos dentro da mesma camada.

Mas precisamos olhar para a palavra "camada" um pouco, já que camadas vêm em diferentes formas e tamanhos. Muitas vezes, quando usamos a palavra "camada" pensamos Data Access Layer ou camada de apresentação, e nós geralmente permitem camadas olhar para baixo, mas não upwars.

Dentro de cada camada, os diferentes módulos muitas vezes também deixar-se dispostos em camadas, logicamente. A mesma regra aplica-se aqui; um módulo pode olhar para baixo, mas não para cima. Com isso em mente, ele se sente bastante segura para módulos de referência dentro da mesma camada (exterior).

Só não tem dois módulos de referência entre si, direta ou indiretamente. Se você achar que A e B ambos funcionalidade necessidade uns dos outros (o que indica que A e B estão no mesmo nível), você provavelmente terá que refatorar o código, talvez a introdução de um novo módulo C, logicamente colocado abaixo A e B que tanto deles pode usar.

Além disso, mantenha em mente para manter os módulos como destacado quanto possível; a menos que eles sabem sobre o outro, melhor.

como disse Pavel, ter cuidado com as suas dependências cíclicas. Se você absolutamente não pode viver sem uma dependência cíclica (o que você chama de referência cruzada), as classes devem ser não só a partir do mesmo 'camada', mas também o mesmo conjunto.

Dito isto, não deve haver nenhuma razão para referência cruzada -. Não só deve (como Pavel disse) módulos depende apenas as camadas abaixo delas, que só de ida-dependência deve existir em todos os casos

Há algumas exceções lógicas a esta regra, por exemplo, algo como um modelo de domínio - um cliente terá um número de pedidos, dizem. Pode ser útil nesse caso (esp com ORMs etc) para ter uma lista de pedidos para o cliente, e uma referência para o cliente de cada ordem. Em termos de unidades de funcionalidade como serviços etc, não só deve ser uma maneira dependências.

Uma forma de contornar este problema é usar inversão de controle através de Windsor, Autofac, spring.net etc. Você pode definir uma interface em uma montagem e outro objeto que consome uma implementação concreta dessa interface. Outra biblioteca pode conter a implementação real (o que significa que a montagem deve fazer referência a primeira montagem). Neste caso, o contêiner IoC agarra a implementação.

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