projeto n-tier - melhor maneira de passar dados recuperação de objeto

votos
1

Eu estou usando um projeto básico de 3 camadas. Para flexibilidade (e teste) propósitos, eu queria que a camada de dados a ser abstrato e especificar a classe concreta no meu código. Mas, como eu deveria repassá-lo aos meus objetos de negócios. Aqui está um exemplo (código pseudo):

abstract class IDataLayer
{
    PersonData GetPerson(int); //PersonData would be a row of data from a table for example
    JobData[] GetJobs(int);
    void UpdatePerson(PersonData);
}

class ConcreteDataLayerSQL : IDataLayer
{
...
}
class ConcreteDataLayerXML : IDataLayer
{
...
}

class PersonBAL
{
    void PersonBAL(personId)
    {
        //What goes here?
    }

    JobBAL[] GetJobs()
    {
       //What goes here?
    }
}
class Program
{
    static void Main()
    {
        person = new PersonBAL(1);
    }
}

Portanto, o problema é, como é que PersonBAL saber qual ConcreteDataLayer de usar? Estou pensando entre algumas opções:

1: passar a camada de dados concreta para pessoa. Isso se torna uma dor quando você começar a adicionar novas classes que precisam interagir com a camada de dados (algo como novo PersonBAL (IDataLayer, int), em seguida, nova JobBAL (IDataLayer, int), etc etc)

2: Criar um objeto estático que mantém que a camada de dados para usar (Leia: variável global)

Quaisquer outras ideias?

Publicado 27/08/2009 em 01:47
fonte usuário
Em outras línguas...                            


3 respostas

votos
1

O problema que você está tentando resolver é "injeção de dependência".

Assumindo que este é o código .NET (seu idioma pseudo-código se parece muito com C #), você pode querer olhar para um quadro como Spring.NET que é projetado para esse tipo de coisa.

Respondeu 27/08/2009 em 02:02
fonte usuário

votos
0

você poderia colocar uma camada de engano em seu código para que você nunca construído diretamente uma PersonBALvez que você tem um PersonBALFactoryque você usa para construir seus PersonBALcasos. A fábrica tem a dependência do IDataLayer que é passado através do construtor (e que é ligado até à sua aplicação o tempo de arranque) e você dizer a fábrica para criar pessoa usando um PersonId e da cria um novo PersonBAL passando a ID e o IDataLayer. Dessa forma, o usuário não precisa se preocupar com a qual IDataLayer você está usando, ele está configurado na configuração de aplicações em tempo de inicialização, o usuário apenas solicita nova PersonBAL usando as informações que eles sabem.

estruturas DI vai ajudá-lo a configurar toda a injeção de dependência para que os tipos corretos são passados ​​para os construtores e fará a configuração das fábricas (e coisas que têm uma dependência nas fábricas) automáticas e mais simples quando você tem um monte de fábricas ou gráficos de dependência complexas.

Respondeu 25/11/2010 em 12:24
fonte usuário

votos
0

Acho passando a classe em cada construtor seria um desafio para a razão que você listou e porque alterar o código para usar uma classe diferente seria uma tarefa propensa a erros.

Dependency Injection é o núcleo do framework Spring. Primavera usa arquivos de configuração XML para descrever as relações entre classes. Para o seu caso de uso, você pode especificar o tipo específico que você deseja instanciar na configuração, assim você só tem que fazer uma mudança para mudar implementações.

A primavera é um quadro bem conhecido e testado, mas é claro que você não precisa dele para resolver o problema. Você poderia muito bem escrever você possui código para arquivos de configuração. De qualquer maneira, este é essencialmente uma variação sobre a segunda opção que você mencionou.

Respondeu 27/08/2009 em 17:23
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more