ASP.NET MVC – Devo usar o Padrão de Repositório para gravar ViewModels no database ou convertê-los para Modelos primeiro?

No meu aplicativo ASP.NET MVC, tenho uma página de edição bastante complexa que combina vários modelos em uma visualização.

Estou usando o padrão ViewModel para combinar todas essas informações e apresentar um object coeso para a View.

Como exemplo, minha estrutura ViewModel é algo assim:

CompanyId CompanyName List Employees List ContactMethods 

O object Employee possui várias propriedades básicas e um método de contato preferencial.

Na página de edição, o usuário recebe todos os funcionários da empresa e eles têm a capacidade de adicionar e remover (usando javascript), além de editar os detalhes dos funcionários. A lista ContactMethods é usada para preencher a lista suspensa de cada funcionário.

Traduzi com sucesso meus Modelos (lidos do database) para este ViewModel e de volta, então, depois de uma edição, fiquei com um ViewModel representando o estado atual dos funcionários da empresa.

Eu estou usando um padrão de repository para se comunicar com o database, então minha pergunta é, devo chamar diretamente para o CompanyRepository, passando o ViewModel, ou devo converter o ViewModel de volta em objects de modelo antes de usar o repository para escrevê-los para o base de dados?

Em suma, o Repositório deve saber sobre meus objects ViewModel?

Eu converteria o ViewModel novamente em objects Model primeiro. Eu gosto de manter a dependência entre minha camada da Web e as camadas do Repository o mais solto possível.

Eu não acho que o seu repository deve saber sobre o seu ViewModel, uma vez que é um conceito de nível web.

ViewModel é o modelo para a exibição (UI), portanto, o repository não deve saber sobre o modelo de exibição. Separá-los manterá o repository fracamente acoplado à interface do usuário.

Use outra camada, como a camada de serviço, para encapsular o repository da interface do usuário. Essa camada também faz o ViewModel – Model conversation e faz a chamada do respositório.

 public class ServiceLayer { public void SaveModel(ViewModel viewmodel) { var model = viewModel.ToModel(); repository.Save(model) } } 

Eu concordaria com a resposta anterior de converter ViewModels de volta para modelos “simples”, mas acrescentaria que essa tarefa provavelmente deveria ser executada por uma camada de serviço separada. Essa camada seria responsável por desmontar seus ViewModels e agir de maneira apropriada.

Esta é essencialmente a definição de um serviço: algo cujo trabalho é realizar uma unidade lógica de trabalho que requer vários modelos e / ou lógica complexa.