2009-07-27 4 views
0

Notre modèle «utilisateur» nécessite une petite image de profil, et je ne suis pas entièrement sûr de la manière de le gérer. Bien sûr, nous pourrions simplement l'enregistrer dans un dossier sur le disque et stocker le chemin d'accès/nom de fichier à la base de données, mais je pense que je préfère l'avoir stocké dans la base de données elle-même.Meilleures pratiques pour les images dans un modèle avec Castle ActiveRecord/MonoRail

Ma première pensée était d'avoir une propriété sur le modèle comme celui-ci:

[Property] 
public byte[] ProfilePicture 
{ 
    get; 
    set; 
} 

Mais il se sent sûr que je vais devoir aller un long chemin pour le faire fonctionner de cette façon - obtenir un tableau d'octets de la base de données, puis en le convertissant en une image avec un type de gestionnaire.

Est-ce que quelqu'un a vu un bon tutoriel sur la façon de gérer ce genre de chose? Il semble que ce serait une exigence assez commune que je trouverais quelque chose de spécifique à MonoRail, mais jusqu'à présent, mes recherches sont apparues vides.

Répondre

1

A propos du stockage d'images sur une base de données ou des fichiers, voir this question.

Si vous avez décidé de le stocker sur DB, la chose la plus importante est que vous ne pas récupérer le byte[] chaque fois que vous rechercher un utilisateur, qui pourrait être potentiellement un grand nombre de données et un problème de perf. Pour ce faire, vous pouvez soit stocker l'image dans une autre table ou la carte du byte[] à une autre entité avec la même table (en supposant que l'utilisateur ne peut avoir qu'une seule image):

[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;} 
} 

Cela aurait des comportements géniaux quoique . Par exemple, pour un utilisateur donné, le ProfilePicture ne sera jamais nul. Vous n'insérez pas ou ne supprimez pas réellement UserProfilePicture puisqu'il s'agit en fait de l'utilisateur, mais que vous le mettrez toujours à jour. Et vous encourrez une jointure supplémentaire, et vous devez être au courant de SELECT N+1. C'est juste sur le dessus de ma tête, complètement non testé. Conclusion: stocker des images dans une autre table est beaucoup plus flexible.

Si vous souhaitez utiliser un Image au lieu de byte[], mettez en œuvre IUserType. Mais rappelez-vous que l'image est une IDisposable, et ce sera très difficile de le disposer au bon moment.

La mise en œuvre d'un contrôleur de monorail qui renvoie une image est assez simple ... il suffit d'utiliser [ARFetch] pour obtenir le UserProfilePicture par id et écrire dans le flux de réponse avec le type de contenu approprié.

Questions connexes