Pergunta

I têm um repositório (CustomerRepository) que recupera dados da camada de dados. A maior parte da lógica de negócios está na classe entidade (Customer) que o repositório aceita ou retorna.

No entanto, quando você coloca a lógica de negócios entidade global (que se aplica a todos os clientes)?

Por exemplo, eu pode não querer voltar todos os clientes a determinados usuários. Eu não quero colocar essa lógica no repositório.

Foi útil?

Solução

Eu concordo com Robert Munteanu.

Basicamente você arregaçar sua lógica de negócio que não é inerente a seu modelo em uma camada intermediária. A camada intermediária é a / objetos de negócios / camada de lógica de negócios camada de negócios / etc, mas é apenas referido como um nível de serviço. Ele não tem que ser um webservice, a uma ampla utilização do serviço prazo na medida em que agrega funcionalidade de uma área de aplicação específica.

Você tem basicamente uma classe CustomerService que contém a referência repositório. Sua camada de apresentação faria referência a classe camada de serviço.

Há uma distinção adicional que pode ser feita como um palpite de seu nome que você estiver usando .net, e provavelmente usando LINQ to SQL como seu repositório, conforme descrito no NerdDinner.

O Repositório normalmente retorna IQueryable para a camada de serviço, permitindo que a cadeia de camada de serviço em conjunto várias consultas para construir conjuntos de resultados diferentes. O serviço, em seguida, avalia a expressão usando ToList ou outro método semelhante e retornos que a camada de apresentação.

Outras dicas

envolvê-la atrás de um serviço.

Coloque-o em outro repositório (BusinessRuleRepository) e têm CustomerRepository usá-lo.

ou

Se a lógica de negócios só é limitar os resultados de um usuário pode ver que você pode querer usar um padrão Fachada com uma fábrica. Neste caso, você teria um ICustomerRepository que lida com o seu CustomerRepository e LimitedCustomerRepository (que pode encapsular CustomerRepository), e um CustomerRepositoryFactory que retorna a ICustomerRepository apropriado para o usuário.

Eu acho que separa esses tipos de funções em uma camada de serviço é o caminho a percorrer.

Recentemente, construímos um sistema para fazer previsão complexo, com muitas entidades usando dados históricos. Colocar todos os bits de acesso a dados no repositório para cada entidade. A lógica previsão intrincada I mantidos em uma camada de serviço e passou os objetos de repositório em conforme necessário.

Bônus foi que eu tinha uma maneira fácil para expor toda a lógica de previsão para sistemas externos, basta criar uma camada api web.

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