Pergunta

Eu sou um pouco de um novato DI, então me perdoe se esta é a abordagem errada ou uma pergunta boba.

Vamos dizer que tenho um formulário que cria / atualiza uma ordem, e eu sei que vai precisar para recuperar uma lista de produtos e clientes para mostrar. Eu quero passar o objeto Order que está editando, mas eu também quero injetar o ProductsService e CustomersService como dependências.

Então eu vou querer meu contêiner IoC (o que for que eu vá com) para fornecer os serviços, mas vai ser até o código de chamada para fornecer o objeto para editar.

Devo declarar o construtor como tomar o objeto Order como o primeiro parâmetro eo ProductsService e CustomersService depois disso, por exemplo:

public OrderForm(Order order, ProductsService prodsSvc, CustomersService custsSvc)

... ou se as dependências estão em primeiro lugar e o objeto Order passado, por exemplo:

public OrderForm(ProductsService prodsSvc, CustomersService custsSvc, Order order)

Será que isso importa? Faz depender de qual contêiner IoC eu uso? Ou há uma maneira "melhor"?

Foi útil?

Solução

Eu discordo com a resposta de @ aku.

Eu acho que você está fazendo é bom e há também outras maneiras de fazer isso que não são mais ou menos certo. Por exemplo, pode-se questionar se este objeto deve ser dependendo dos serviços em primeiro lugar.

Independentemente do DI, eu sinto que é útil esclarecer em sua mente, pelo menos, o tipo de estado cada objeto possui, tais como o estado real (Ordem), estado derivado (se houver), e dependências (serviços):

http://tech.puredanger.com/2007/09/18/ espeleologia /

Em qualquer construtor ou método, eu prefiro os dados reais a serem passados ??em primeiro lugar e dependências ou coisas externas a serem passados ??passado. Assim, no seu exemplo, eu prefiro a primeira.

Outras dicas

Matt, você não deve misturar parâmetros normais com dependências. Desde que seu objeto será criado nas partes internas do contêiner IoC, como você está indo para especificar argumentos necessários?

mistura de dependência e normais argumentos fará lógica do seu programa mais complicado.

Neste caso, seria melhor para as propriedades de dependência declare (ou seja, dependências remover do construtor) ou inicializar ordem campo após COI construído OrderForm e resolveu-o de dependências (ou seja, remover parâmetros normais de construtor).

Além disso, você pode declarar todos os seus parâmetros, incluindo fim como dependências.

Eu me sinto um inquieto pouco sobre permitindo uma instância de OrderForm a ser instanciado sem a referência necessário para uma instância Order. Uma razão pode ser que isso me impediria de fazer a verificação inicial para encomendas nulos. Quaisquer outras pensamentos?

Acho que eu poderia ter algum conforto em saber que os objetos orderform só será instanciado por um método de fábrica que garante a propriedade Order é definido depois de fazer a chamada para o framework IoC.

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