Pergunta

Eu sou novo para Dependency Injection e tinha a / orientação pergunta necessidade.

Eu tinha um aplicativo que usou o padrão de repositório para acesso a dados. Eu costumava StructureMap para obter o repositório correto e tudo funcionou bem.

Eu tenho desde que estourou o meu modelo (incluindo a lógica repositório) em sua própria assembleia e acrescentou uma camada de serviço. No interesse de DI a classe camada de serviço leva uma IRepository em seu construtor. Este parece errado para mim como agora todos os consumidores de meu modelo necessidade de saber sobre o repositório (pelo menos configure sua DI para saber qual usar). Eu me sinto como que está se metendo as entranhas do modelo.

O que soa errado com isso?

Foi útil?

Solução

Uma aplicação escrita para injecção uso dependência tipicamente configura uma única instância recipiente onde todos os mapeamentos o tipo de interface / implementação foram registados numa fase de inicialização da aplicação. Isto inclui o registro dos repositórios, serviços, e quaisquer consumidores do serviço dentro do aplicativo.

Ao resolver os consumidores do serviço através do recipiente, os consumidores precisam apenas indicar a sua dependência do serviço, não quaisquer dependências a necessidade poder serviço. Portanto, os consumidores do serviço não será acoplado a suas dependências (por exemplo, seu repositório). Esta é a vantagem de fazer a injeção de dependência através de um recipiente em oposição a fazer a injeção de dependência manual.

Se você está projetando serviços a serem consumidos por outras aplicações na forma de uma biblioteca reutilizável, em seguida, suas opções vão variar dependendo do nível de flexibilidade que você deseja oferta.

Se você presume que todos os clientes de sua biblioteca estará usando injeção de dependência, então você terá de fornecer uma quantidade adequada de documentação sobre que tipos precisam ser registrados dentro de seu recipiente.

Se você presume que todos os clientes estarão usando um recipiente específico (por exemplo StructureMap), então você pode aliviar os requisitos de registro fornecendo registros que encapsulam todas as necessidades de registro do específicas para o cliente.

Se você deseja permitir sua biblioteca para ser usada pelos clientes que não usam seu próprio recipiente injeção de dependência, em seguida, você pode fornecer uma fábrica estática que retorna o serviço. Dependendo do nível de complexidade, tal cenário um pode não exigir a utilização de um recipiente (por exemplo, se o seu atendimento é constituída por apenas alguns objetos no total). Se a sua biblioteca é composta de uma quantidade substancial de componentes que precisam ser composta então você pode ter fábricas que resolve os serviços através de suas próprias necessidades de inicialização de infra-estrutura interna compartilhados.

Outras dicas

Eu entendo o seu dilema há Dan, eu também passei muito tempo lutando mais que em minha mente. Eu acredito que a maneira que eu decidi ir para a frente com foi uma das melhores maneiras para encapsular todas as preocupações e ainda ter fácil manutenção objetos fracamente acoplados.

Eu escrevi este post especificamente sobre NHiberante mas se você olhar para o padrão de repositório em implementar você pode facilmente mudar o código específico NH usar seu BackingStore.

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

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