Gostaria de saber porque, se for, por que o Entity Framework não oferece lógica para criar um novo objeto com as mesmas propriedades para transferir dados entre camadas?
Eu uso os objetos de entidade que eu gero com a estrutura da entidade.
Gostaria de saber porque, se for, por que o Entity Framework não oferece lógica para criar um novo objeto com as mesmas propriedades para transferir dados entre camadas?
Eu uso os objetos de entidade que eu gero com a estrutura da entidade.
Respostas:
É com você.
A maioria das pessoas lhe dirá que não é uma boa prática, mas você pode se safar disso em alguns casos.
A EF nunca jogou bem com o DDD por várias razões, mas duas se destacam: você não pode ter construtores parametrizados em suas entidades e não pode encapsular coleções. O DDD depende disso, pois o modelo de domínio deve incluir dados e comportamento.
De certa forma, o EF obriga a ter um modelo de domínio anêmico e, nesse caso, você pode usar as entidades como DTOs. Você pode ter alguns problemas se usar as propriedades de navegação, mas poderá serializar essas entidades e enviá-las por fio. Pode não ser prático, no entanto. Você precisará controlar a serialização de cada entidade que possui propriedades que você não precisa enviar. A maneira mais fácil é simplesmente projetar classes separadas personalizadas para transferência de dados. Bibliotecas como o AutoMapper são criadas para esse fim.
Por exemplo: Suponha que você tenha uma classe chamada Person
com a seguinte definição:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; get; }
// plus a bunch of other properties relevant about a person
}
Supondo que você queira exibir uma lista de funcionários em algum lugar, pode ser prático enviar apenas o Id
, FirstName
e LastName
. Mas você terá que enviar todas as outras propriedades irrelevantes. Não é um problema tão grande se você não se importa com o tamanho da resposta, mas a idéia geral é enviar apenas os dados relevantes. Por outro lado, você pode projetar uma API que retorne uma lista de pessoas e, nesse caso, o envio de todas as propriedades pode ser necessário, fazendo sentido serializar e enviar as entidades. Nesse caso, a criação de uma classe DTO é discutível. Algumas pessoas gostam de misturar entidades e DTOs, outras não.
Para responder sua pergunta atualizada, EF é um ORM. Seu trabalho é mapear os registros do banco de dados para objetos e vice-versa. O que você faz com esses objetos antes e depois de passar pelo EF não faz parte de suas preocupações. Nem deveria ser.
Não não é.
Idealmente, os DTOs corresponderão aos seus repositórios de persistência (também conhecidos como tabelas de banco de dados).
Mas suas classes de negócios não são necessariamente compatíveis. Você pode precisar de classes adicionais, separadas ou ingressadas no que você tem no banco de dados. Se seu aplicativo for pequeno, talvez você não veja esse tipo de problema, mas em aplicativos de médio a grande porte, isso acontecerá com frequência.
Outra coisa é que os DTOs fazem parte do domínio de qualquer coisa que lide com persistência, enquanto sua Camada de Negócios não deve saber nada sobre eles.
Na verdade, é uma péssima ideia. Martin Fowler tem um artigo sobre DTOs locais .
Para encurtar a história, o DTO
Pattern foi usado para transferir dados para fora do processo, por exemplo, através do fio e não entre camadas dentro do mesmo processo.
Não, é uma prática ruim.
Algumas razões:
@JsonIgnore
no mundo Java), mas isso leva ao próximo problema ...get
método da entidade.Portanto, é mais fácil e seguro usar algum tipo de ferramenta de mapeamento para ajudá-lo nesse trabalho, mapeando os campos da entidade para um Dto.
Para concluir o que o @Dherik disse, os principais problemas do uso de objetos de entidade como objetos de transferência de dados são:
Em uma transação, você corre o risco de confirmar as alterações feitas em sua entidade porque a usa como DTO (mesmo que você possa desanexar a entidade da sessão em uma transação, na maioria das vezes precisará verificar esse estado antes qualquer modificação no seu DTO da entidade e garanta que você não está em uma transação ou que a sessão foi encerrada se você não quiser que as modificações sejam persistentes).
O tamanho dos dados que você compartilha entre o cliente e o servidor: às vezes você não deseja enviar todo o conteúdo de uma entidade para o cliente para minimizar o tamanho da resposta da solicitação. Separar o DTO da entidade é mais flexível, para especializar os dados que você deseja enviar em certos casos de uso.
Visibilidade e manutenção: você precisa gerenciar as anotações jpa / hibernate nos campos da entidade e manter as anotações jackson para serializar no json no mesmo local (mesmo que você possa separá-las da implementação da entidade, colocando-as na interface herdada pelo entidade). Então, se você alterar o conteúdo do DTO ao adicionar um novo campo, outra pessoa provavelmente poderá pensar que é um campo da entidade, portanto, um campo da tabela em questão no seu banco de dados (mesmo que você possa usar a @Transient
anotação em todos os seus campos do DTO para o caso ..!).
Na minha opinião, isso cria ruído quando você lê a entidade, mas minha opinião é certamente subjetiva.