Pergunta

Eu estou escrevendo um aplicativo usando técnicas de DDD. Esta é a minha primeira tentativa de um projeto DDD. Ele também é meu primeiro projeto greenfield e eu sou o único desenvolvedor. Eu clarificado, o modelo de domínio e interface de usuário. Agora estou começando na camada de persistência. Eu começo com um teste de unidade, como de costume.

[Test]
public void ShouldAddEmployerToCollection()
{
    var employerRepository = new EmployerRepository();
    var employer = _mockery.NewMock<Employer>();

    employerRepository.Add(employer);
    _mockery.VerifyAllExpectationsHaveBeenMet();
}

Como você pode ver eu não tenho escrito qualquer expectativa para o add () função. I chegou até aqui e percebi que não se instalaram em um fornecedor de banco de dados específica ainda. Na verdade eu nem tenho certeza que chama para um motor db em tudo. arquivos simples ou XML pode ser tão razoável. Então, eu estou querendo saber deixado o meu próximo passo deveria ser.

Devo adicionar outra camada de abstração ... dizer uma interface DataStore ou olhar para uma biblioteca existente que já fez o trabalho para mim? Eu gostaria de evitar amarrando o programa para uma tecnologia de banco de dados específico, se puder.

Foi útil?

Solução

Com suas necessidades, a única abstração que você realmente precisa é uma interface de repositório que tem semântica CRUD básicos para que o seu código de cliente e objetos de colaboração apenas lidar com IEmployerRepository objetos em vez de repositórios de concreto. Você tem algumas opções para ir sobre isso:

1) Não mais abstrações . Apenas construir o repositório de concreto em sua aplicação de nível superior, onde você precisar dele:

IEmployeeRepository repository = new StubEmployeeRepository();
IEmployee           employee   = repository.GetEmployee(id);

Mudar isso em um milhão de lugares vai ficar velho, então esta técnica só é realmente viável para projectos muito pequenos.

2) Criar fábricas de repositório para usar em sua aplicação:

IEmployeeRepository repository = repositoryFactory<IEmployee>.CreateRepository();
IEmployee           employee   = repository.GetEmployee(id);

Você pode passar a fábrica repositório para as classes que irão utilizá-lo, ou você pode criar uma variável de nível de aplicação estática para mantê-lo (é um singleton, o que é lamentável, mas razoavelmente bem delimitado).

3) Utilizar um dependência recipiente injecção (essencialmente uma fábrica de finalidade geral e o mecanismo de configuração):

// A lot of DI containers use this 'Resolve' format.
IEmployeeRepository repository = container.Resolve<IEmployee>();
IEmployee           employee   = repository.GetEmployee(id);

Se você não usou recipientes DI antes, há muitas boas perguntas e respostas sobre eles aqui no SO (como Que C # /. enquadramentos injeção NET dependência são pena olhar em? e acesso a dados, testes unitários, injeção de dependência ), e você iria querer ler de Martin Fowler Inversão de Controle Containers ea dependência padrão de injecção ).

Outras dicas

Em algum momento você terá que fazer uma chamada sobre o que seu repositório vai fazer com os dados. Quando você está começando seu projeto provavelmente é melhor para mantê-lo o mais simples possível, e só adicionar camadas de abstração quando necessário. Basta definir o que seus repositórios / DAOs são é provavelmente o suficiente nesta fase.

Normalmente, o repositório / repositórios / DAOs deve saber sobre os detalhes de implementação dos quais banco de dados ou ORM você decidiu usar. Espero que este é porque você está usando repositórios no DDD. Desta forma, os testes podem zombar dos repositórios e ser agnóstico da implementação.

Eu escrevi um post sobre a implementação do padrão Repository em cima do NHibernate, eu acho que vai beneficiá-lo, independentemente de você usar NHibernate ou não.

Criando um comum genérica e extensível NHiberate Repository

Uma coisa que eu encontrei com camadas de persistência é certificar-se de que há um local onde você pode começar a fazer abstração. Se você é banco de dados cresce, você pode precisar para começar a implementar fragmentação ea menos que já existe uma camada de abstração já disponíveis, pode ser difícil para adicionar um mais tarde.

Eu acredito que você não deve adicionar mais uma camada abaixo das classes de repositório apenas para fins de teste de unidade, especialmente se você não tiver escolhido o seu tecnologia de persistência. Eu não acho que você pode criar uma interface mais granular do que "repository.GetEmployee (id)", sem expor detalhes sobre o método de persistência.

Se você está realmente pensando em usar arquivos de texto ou XML planas, acredito que a melhor opção é ficar com a abstração interface de repositório. Mas se você decidiu usar bancos de dados, e você apenas não está certo sobre o fornecedor, uma ferramenta ORM pode ser o caminho a percorrer.

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