IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Architecture, Operator, classe abstraite


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut Architecture, Operator, classe abstraite
    Bonjour!

    Difficile de donner un titre précis au problème qui m'occupe. Je pose rapidement le décor: j'ai des objets business et leurs équivalents objets de présentation, des facades, et des web services.

    Prenons un cas simple.

    - J'ai un objet business File, avec ses propriétés (FileName, FileContent, etc.) et ses méthodes (Copy(), Convert(), etc.).
    - J'ai son équivalent présentation FileDTO avec uniquement les propriétés utilisées lors de l'affichage (FileName, FileSize, etc.).
    - J'ai une facade avec des opérations de base: GetFile, GetAllFiles, CreateFile, UpdateFile, etc.

    La facade manipule les objets business (File) en interne mais ne prend en paramètre ou ne renvoi à la couche présentation que des objets présentation (FileDTO).

    Tout ceci fonctionne à merveille et j'agrémente ma facade d'opération spécifique à l'objet concerné.

    Je réplique ce schéma pour tous mes objets business et me rend rapidement compte que je duplique pas mal de code (toutes les opérations de base CRUD).

    Je décide donc de créer un objet business de base, un objet présentation de base et une façade de base afin de généraliser le tout. Et c'est la que ca coince.

    En effet, prenons la méthode GetAll:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public abstract class BaseFacade<Entity, DTO>
    	where Entity : BusinessEntity
    	where DTO : BaseDTO
    {
    	public List<DTO> GetAll()
    	{
    		List<DTO> result = new List<DTO>();
    
    		QuerySet<Entity> qs = EntityManager.Instance.ListEntities<Entity>(null, null, null, 0, 0);
    
    		foreach (Entity entity in qs)
    		{
    			DTO item = (DTO)entity;
    			result.Add(item);
    		}
    
    		return result;
    	}
    }
    Ne compile pas; normal: DTO ne connait pas d'opération de conversion pour transformer entity en DTO. Hors sur mes objets DTO, je définit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static explicit operator FileDTO(File file)
    {
    	FileDTO item = new FileDTO();
     
                 ...
                 item.FileContent = file.FileContent;
    	item.FileName = file.FileName;
                 ...
     
    	return item;
    }
    Mais il n'est pas possible (à ma connaissance) de définir cette méthode de conversion explicite de manière abstraite sur la classe de base.

    Connaissez vous un moyen de détourner ce fonctionnement? Evidement, le plus simple serait de créer un méthode abstraite au sein de BaseDTO nommée Convert()... mais en static ca sera impossible!

    Merci pour vos retours!
    Neptune

  2. #2
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Salut.

    Bon je doit avouer que je suis à l'ouest aujourd'hui et que j'ai pas tout compris ( et pourtant j'ai schotché pendant 10 mn devant l'écran ).

    Le truc qui me viens à l'esprit c'est : Pourquoi pas une classe utilitaire statique avec une méthode surchagé pour chaque type de donnée ?

    Ainsi ça donnerait cela :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    public static class ConvertUtilities
    {
        public static object Convert(object init)
        {
               if( init is File )
                   return ConvertFileToFileDTO(init);
             ./...
        }
     
        private static object ConvertFileToFileDTO(object o)
        {
              File file = (File)o;
              ....
     
     
        }
    }
     
    public abstract class BaseFacade<Entity, DTO>
    	where Entity : BusinessEntity
    	where DTO : BaseDTO
    {
    	public List<DTO> GetAll()
    	{
    		List<DTO> result = new List<DTO>();
     
    		QuerySet<Entity> qs = EntityManager.Instance.ListEntities<Entity>(null, null, null, 0, 0);
     
    		foreach (Entity entity in qs)
    		{
    			DTO item = ConvertUtilities.Convert(entity);			result.Add(item);
    		}
     
    		return result;
    	}
    }

  3. #3
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    Oui, c'est une solution, mais je voulais garder le concept de casting.

    Quoi qu'il en soit, je remarque que cette "standardisation" de la facade ne concerne que très peu de cas au sein de mon projet et finalement, je n'y gagnerai pas grand chose.

    Je pense que ce post peut tomber aux oubliettes ;-)

    Merci quand meme

Discussions similaires

  1. Problème d'architecture sur des classes abstraites
    Par Walther Bishop dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2013, 11h26
  2. [Débutant(e)] toString + classes abstraites
    Par debdev dans le forum Langage
    Réponses: 9
    Dernier message: 26/01/2005, 15h22
  3. [Debutant][Conception] Classes abstraites et interface.
    Par SirDarken dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2004, 00h02
  4. Classe abstraite / MVC
    Par caramel dans le forum MVC
    Réponses: 5
    Dernier message: 01/04/2003, 09h27
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo