Melhores Práticas para imagens em um modelo com Castle ActiveRecord / MonoRail
-
19-09-2019 - |
Pergunta
O nosso modelo "usuário" precisa de uma pequena imagem de perfil sobre ele, e eu não sou inteiramente certo como lidar com isso. Claro que poderia apenas guardá-lo para uma pasta no disco e armazenar o caminho / nome do arquivo para o banco de dados, mas eu acho que eu prefiro tê-lo armazenado na própria DB.
Meu primeiro pensamento foi para ter uma propriedade no modelo como este:
[Property]
public byte[] ProfilePicture
{
get;
set;
}
Mas com certeza parece que eu vou ter que ir um longo caminho para fazê-lo funcionar desta forma -. Recebendo um array de bytes a partir do banco de dados, em seguida, convertê-lo para uma imagem com algum tipo de manipulador
Alguém viu um bom tutorial sobre como lidar com esse tipo de coisa? Parece que seria um requisito comum o suficiente para que eu encontrar algo MonoRail específica, mas até agora minhas pesquisas vêm-se vazia.
Solução
Sobre o armazenamento de imagens no banco de dados ou arquivos, consulte esta questão .
Se você decidiu armazená-lo no DB, a coisa mais importante é que você não recuperar o byte[]
cada vez que você consulta para um usuário, que poderia ser potencialmente uma grande quantidade de dados e um problema perf. Para fazer isso você poderia armazenar a imagem em outra tabela ou mapear a byte[]
para outra entidade com a mesma tabela (assumindo que o usuário pode ter apenas uma imagem):
[ActiveRecord("users")]
public class UserWithoutPicture {
[PrimaryKey]
public virtual int Id {get;set;}
...
[BelongsTo]
public virtual UserProfilePicture ProfilePicture {get;set;}
}
[ActiveRecord("users")]
public class UserProfilePicture {
[PrimaryKey]
public virtual int Id {get;set;}
[Property]
public virtual byte[] Image {get;set;}
}
Isto tem alguns comportamentos funk embora . Por exemplo, para um determinado usuário, o ProfilePicture
nunca seria nulo. Você realmente não iria inserir ou UserProfilePicture
de exclusão, já que é na verdade o usuário, em vez disso você sempre atualizar. E você seria incorrer em juntar um adicional, e você tem que estar ciente de escolha dos n + 1 . Isso é apenas fora do topo da minha cabeça, completamente testado .
Conclusão:. Armazenar imagens em outra tabela é muito mais flexível
Se você quiser a conveniência de lidar com um Image
em vez de byte[]
cru, implementar IUserType
. Mas lembre-se que a imagem é um IDisposable, e vai ser muito difícil para eliminá-lo no momento certo.
A implementação de um controlador de monotrilho que retorna uma imagem é bastante simples ... apenas uso [ARFetch]
para obter o UserProfilePicture
por id e gravação para o fluxo de resposta com o tipo de conteúdo apropriado.