Perguntas sobre 'entity'

2
respostas

Entidade para o uso do DTO

Está tentando criar um fluxo para um aplicativo da Web em camadas básico e está lendo informações conflitantes on-line. O que eu estou tentando descobrir é se há uma vantagem em continuar usando objetos DTO do seu DAO para a camada de serviço at...
17.05.2013 / 17:40
4
respostas

Quando devemos usar entidades fracas ao modelar um banco de dados?

Esta é basicamente uma questão sobre o que são entidades fracas? Quando devemos usá-los? Como eles devem ser modelados? Qual é a principal diferença entre entidades normais e entidades fracas? As entidades fracas correspondem a objetos de val...
06.12.2012 / 12:32
4
respostas

Acessando Repositórios do Domínio

Digamos que temos um sistema de registro de tarefas, quando uma tarefa é registrada, o usuário especifica uma categoria e a tarefa padroniza para um status de 'Excelente'. Suponha, neste caso, que Categoria e Status tenham que ser implementados...
24.09.2012 / 17:20
2
respostas

Como criar nova raiz agregada no CQRS?

Como devemos criar novas raízes agregadas na arquitetura cqrs? Neste exemplo, quero criar uma nova raiz agregada AR2 que tenha referência ao primeiro AR1. Estou criando o AR2 usando o método AR1 como ponto de partida. Até agora eu vejo poucas...
21.02.2017 / 13:20
2
respostas

Como projetar os limites agregados?

Eu gostaria de escrever um aplicativo como o comércio eletrônico. E você sabe que, em aplicativos semelhantes, os produtos podem ter propriedades e recursos diferentes. Para simular essa oportunidade, criei as seguintes entidades de modelo de...
22.11.2017 / 06:53
3
respostas

___ qstnhdr __ Entidades do Entity Framework - Alguns dados do serviço da Web - Melhor arquitetura? ______ qstntxt ___

No momento, estamos usando o Entity Framework como um ORM em alguns aplicativos da Web e, até agora, ele nos adequou bem, pois todos os nossos dados são armazenados em um único banco de dados. Estamos usando o padrão de repositório, e temos serviços (a camada de domínio) que os utilizam, e retornamos as entidades do EF diretamente aos controladores ASP.NET MVC.

No entanto, surgiu um requisito para utilizar uma API de terceiros (por meio de um serviço da web) que nos fornecerá informações extras relacionadas ao usuário em nosso banco de dados. Em nosso banco de dados de usuários local, armazenaremos um ID externo que podemos fornecer à API para obter informações adicionais. Há um pouco de informação disponível, mas por uma questão de simplicidade, uma delas se relaciona com a empresa do usuário (nome, gerente, sala, cargo, local, etc.). Essas informações serão usadas em vários lugares em nossos aplicativos da Web, em vez de serem usadas em um único lugar.

Então, minha pergunta é: qual é o melhor lugar para preencher e acessar essas informações? Como ele é usado em vários lugares, não é realmente fácil buscá-lo em uma base ad-hoc onde quer que utilizemos no aplicativo da Web - portanto, faz sentido retornar esses dados adicionais a partir da camada de domínio.

Meu pensamento inicial era apenas criar uma classe de modelo wrapper que conteria a entidade EF (EFUser) e uma nova classe 'ApiUser' contendo as novas informações - e quando recebemos um usuário, obtemos o EFUser e depois obtenha as informações adicionais da API e preencha o objeto ApiUser. No entanto, enquanto isso seria bom para obter usuários individuais, ele cai ao obter vários usuários. Não conseguimos acessar a API ao obter uma lista de usuários.

Meu segundo pensamento foi apenas adicionar um método singleton à entidade EFUser que retorna o ApiUser e apenas preenchê-lo quando necessário. Isso resolve o problema acima, pois só o acessamos quando precisamos.

Ou o pensamento final era manter uma cópia local dos dados em nosso banco de dados e sincronizá-los com a API quando o usuário fizer login. Isso é um trabalho mínimo, pois é apenas um processo de sincronização - e não temos o sobrecarga de atingir o banco de dados e API toda vez que queremos obter informações do usuário. No entanto, isso significa armazenar os dados em dois locais e também significa que os dados estão desatualizados para qualquer usuário que não tenha feito login por algum tempo.

Alguém tem algum conselho ou sugestão sobre a melhor forma de lidar com esse tipo de cenário?

    
______ azszpr221599 ___

Seu caso

No seu caso, todas as três opções são viáveis. Eu acho que a melhor opção é provavelmente para sincronizar suas fontes de dados em algum lugar o aplicativo asp.net não está ciente de. Ou seja, evite as duas buscas em primeiro plano todas as vezes, sincronize a API com o db silenciosamente). Então, se isso é uma opção viável no seu caso - eu digo, faça.

Uma solução em que você faz a busca 'uma vez' como a outra resposta sugere não parece muito viável, uma vez que não mantém a resposta em nenhum lugar e a ASP.NET MVC fará a busca de cada solicitação repetidas vezes.

Eu evitaria o singleton, não acho que seja uma boa ideia, por várias razões usuais.

Se a terceira opção não for viável - uma opção é preguiçosa carregá-la. Ou seja, ter uma classe para estender a entidade e fazer com que ela atinja a API em uma base precisa . Essa é uma abstração muito perigosa, já que é um estado ainda mais mágico e não óbvio.

Eu acho que isso realmente se resume a várias perguntas:

  • Com que frequência os dados de chamadas da API são alterados? Não frequentemente? Terceira opção. Frequentemente? De repente, a terceira opção não é muito viável. Não tenho certeza se sou contra chamadas ad-hoc como você.
  • Qual é o custo de uma chamada da API? Você paga por chamada? Eles são rápidos? Livre? Se eles são rápidos, fazer uma ligação a cada vez pode funcionar, se eles são lentos, você precisa ter algum tipo de previsão no lugar e fazer as chamadas. Se eles custam dinheiro - isso é um grande incentivo para o armazenamento em cache.
  • Quão rápido o tempo de resposta tem que ser? Obviamente, mais rápido é melhor, mas sacrificar a velocidade pela simplicidade pode valer a pena em alguns casos, especialmente se não estiver diretamente voltado para o usuário.
  • Quão diferentes são os dados da API dos seus dados? Eles são duas coisas conceitualmente diferentes? Se assim for, pode ser ainda melhor expor a API apenas em vez de retornar o resultado da API diretamente com o resultado e deixar o outro lado fazer a segunda chamada e lidar com o gerenciamento.

Uma palavra ou duas sobre a separação de interesses

Permita-me argumentar contra o que Bobson está dizendo sobre a separação de preocupações aqui. No final do dia - colocar essa lógica nas entidades como essa viola a separação de preocupações tão ruim quanto isso.

Ter um repositório desse tipo viola a separação de interesses tão ruim colocando a lógica centrada na apresentação na camada de lógica de negócios. Seu repositório agora está ciente da apresentação de coisas relacionadas, como a maneira como você exibe o usuário em seus controladores mvc do asp.net.

Em esta questão relacionada , perguntei sobre como acessar entidades diretamente de um controlador. Permita-me citar uma das respostas:

%bl0ck_qu0te%

(Leia o resto da resposta, é muito legal).

É ingênuo ignorar o fato de que existe um banco de dados - existe um banco de dados, e não importa o quanto você queira abstrair isso, não vai a lugar algum. Seu aplicativo irá estar ciente da fonte de dados. Você não será capaz de fazer um "hot swap". ORMs são úteis , mas eles vazam devido à complexidade do problema que eles resolvem e por vários motivos de desempenho (como o Select n + 1 por exemplo).

    
______ azszpr221529 ___

Com a correta separação de interesses , nada acima do nível do Entity Framework / API deve até perceber de onde os dados estão vindo . A menos que a chamada da API seja cara (em termos de tempo ou processamento), o acesso aos dados que a usam deve ser tão transparente quanto acessar os dados do banco de dados.

A melhor maneira de implementar isso, então, seria adicionar propriedades extras ao objeto %code% , que carrega lentamente os dados da API conforme necessário. Algo parecido com isto:

%pre%

Externamente, a primeira vez que %code% ou %code% é usado, haverá uma única chamada de API feita (e, portanto, um pequeno atraso), mas todas as chamadas subseqüentes até que o objeto seja destruído serão tão rápidas e fáceis como acesso ao banco de dados.

    
______ azszpr221731 ___

Uma ideia é modificar o ApiUser para nem sempre ter as informações extras. Em vez disso, você coloca um método no ApiUser para buscá-lo:

%pre%

Você também pode modificar isso ligeiramente para usar o carregamento lento de dados extras, para que você não precise extrair UserExtraData do objeto ApiUser:

%pre%

Dessa forma, quando você tiver uma lista, os dados extras não serão buscados por padrão. Mas você ainda pode acessá-lo enquanto percorre a lista!

    
___

No momento, estamos usando o Entity Framework como um ORM em alguns aplicativos da Web e, até agora, ele nos adequou bem, pois todos os nossos dados são armazenados em um único banco de dados. Estamos usando o padrão de repositório, e temos serv...
12.12.2013 / 17:14
2
respostas

O ID comercial bem conhecido de uma entidade deve ser representado com um tipo dedicado em DDD / OOP?

Em termos práticos, isso significa usar um class personalizado (imutável) sobre um string ou algum outro tipo primitivo. Exemplos: Publicação: Número de livro padrão internacional. Finanças: Número internacional de identificação d...
21.08.2015 / 12:56
1
resposta

Unique Value Object vs Entity

Tentando converter algumas entidades em objetos de valor, estou preso em um caso em que o que parece ser um objeto de valor deve ser exclusivo dentro de um agregado. Suponha que temos uma entidade Filme que cria a raiz de um agregado. Essa...
03.05.2013 / 12:06
2
respostas

Padrão de repositório vs Entidades de gerenciamento do DAO

Sou novo em conceitos como DAO, DAL e Domain Driven Design. No final, quero dissociar a camada de persistência (banco de dados mysql) dos meus objetos de negócios e lógica em um aplicativo da web. Eu gostei do conceito DAO, mas eu fiquei preso a...
23.01.2015 / 19:21
2
respostas

O Padrão de Repositório e o Padrão de Registro Ativo são compatíveis?

Atualmente estou desenvolvendo um webapp onde defini modelos que implementam o padrão Active Record. Cada modelo também é definido por uma interface que especifica as propriedades da Entidade e facilita a injeção em outras classes, especialmente...
25.05.2015 / 00:58