Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Interface générique et héritage [ Système / Autre ] (thiosyiasar)

mardi 15 janvier 2008 à 17:50:06 | Interface générique et héritage

thiosyiasar

Boujour,
 

J'ai un fournisseur de service d'accès aux données.

Je lui passe un type d'entité et lui me retourne le service correspondant.

Chaque service implémente une interface générique en définissant le type d'entité géré

 

Le code fournit compile mais il ' y un pb de cast à l'exécution, ce qui m'étonne à moitié.

 

Avez-vous des solutions ?

Sachant que les services doivent restés typés pour le type d'entité.

Et que j'ai besoin d'un méthode qui me fournit le service a partir d'un type d'entité

//// CODE A EXECUTER 

    //// CODE A EXECUTER //////////////////////////////
    static class Program
    {
        [STAThread]
        static void Main()
        {
            // Création de l'entité
            User oUser = new User();

            // Sélection du service d'accès aux données
            IEntityService<Entity> oService = ServiceProvider.GetService(oUser.GetType());

            // Utiliastion du service pour enregistrer
            oService.Save(User);
        }

    }

    //// DEFINITION DES ENTITES ///
    public abstract class Entity
    {
        public long Id = 0;
    }

    public class Content : Entity { }

    public class User : Entity { }

    //// DEFINITION DES SERVICES ///
    public interface IEntityService<TEntity> where TEntity : Entity
    {
        void Save(TEntity entity);
    }

    public class ContentService : IEntityService<Content>
    {
        public void Save(Content entity) { }
    }

    public class UserService : IEntityService<User>
    {
        public void Save(User entity) { }
    }

    //// DEFINITION DU FOURNISSEUR DE SERVICE ///
    public static class ServiceProvider
    {
        public static IEntityService<Entity> GetService(Type type)
        {
            if (type.Equals(typeof(Content)))
                return (IEntityService<Entity>)new ContentService();
            else if (type.Equals(typeof(User)))
                return (IEntityService<Entity>)new UserService();
            else
                return null;
        }
    }


Merci,

Nico


jeudi 17 janvier 2008 à 15:34:36 | Re : Interface générique et héritage
jeudi 17 janvier 2008 à 15:35:14 | Re : Interface générique et héritage

thiosyiasar

Réponse acceptée !
Bon ca n'a pas l'air d'emballer grand monde mon histoire.... :( J'ai trouvé une solution alternative, le but est d'attaquer le service correspondant sans connaitre le type d'entité. J'ai supprimé la méthode public GetService, et mon provider reprend tout les méthode des services (ici pour l'exemple, la méthode Save(Entity entity), dans le cas d'une méthode sans paramètre, (par ex GetNew()), on lui passe le type en paramètre (Entity GetNew(Type entityType)) Le fournisseur de service a donc cette tete maintenant et ca marche, en utilisant la rélfexion. Si vous avez une solutions plus propres... je suis preneur static class Program { [STAThread] static void Main() { // Création de l'entité User oUser = new User(); // Sélection du service d'accès aux données ServiceProvider.Save(oUser); } } public static class ServiceProvider { public static void Save(Entity entity) { if (entity == null) throw new ArgumentException("L'entité ne peut être nulle"); ExecuteService(entity.GetType(), "Save", new object[] { entity }); } private static object ExecuteService(Type entityType, string methodName, object[] parameters) { // Sélection du service object oService = GetService(entityType); // Sélection de la méthode Type oServiceType = oService.GetType(); MethodInfo oMethod = oServiceType.GetMethod(methodName); // Execution et retour de la valeur object oValue = oMethod.Invoke(oService, parameters); return oValue; } /// /// Retourne le service en fonction du type d'entité donné /// /// IEntityService private static object GetService(Type entityType) { if (entityType == null) throw new ArgumentException("Le type ne peut pas etre null"); else if (!entityType.IsSubclassOf(typeof(Entity))) throw new ArgumentException("Le type doit etre un entité"); else if (entityType.Equals(typeof(Content))) return new ContentService(); else if (entityType.Equals(typeof(User))) return new UserService(); else throw new ArgumentException("Ce type d'entité n'a pas de service attribué"); } } Nico



Cette discussion est classé dans : public, type, class, service, ientityservice


Répondre à ce message

Sujets en rapport avec ce message

Pb Web Service type de donné... [ par DJCODEKILLER ] Bonjour à tousJe suis en train de développer un service web sous Visual Studio en C#.J'utilise le protocole HTTP GETla methode de mon web service me Constructeur "intelligent" [ par revlis ] BonjourJ'ai des class hérité de userControl et je voudrait passer les composant a une class qui les initilise et construit si besoinpour cela j'ai fai retourner une structure [ par bip98 ] J'ai trouve un lien qui en parle... mais il me semble pas très juste:http://www.csharpfr.com/forum.v2.aspx?ID=189261Voilà mon cas: public struct struc Web Service et problème de type [ par nicoloyo ] Bonjour, J'ai créé un web service "MonWebService" et une méthode "System.IO.Stream GetMonStream()" Dans le client j'y accède de cette façon: localh Problèmes de création d'un service Windows [ par nyoto ] Bonjour à tous,Ne développant pas depuis très longtemps en .Net je galère grave pour créer un service windows récupérant automatiquement à intervalles [.NET2] acceder a une fonction de Form1 dans une autre classe [ par ChamY ] Bonjour,J'ai une question toute bete je pense, mais qui me pose un ptit probleme.Je dispose d'une forme avec ca class (class form1), j ai egalement un Je trouve tjs pas de solution pour mon blem "A l'aide" [ par hred1 ] Bon j'explique tout:J'ai le même namespace par toutje suis dans la class 1 (class fraim ok)et je cherche à appler  methode() qui de trouve dans class Dérivation de classe abstraite [ par yoh_777 ] Je voudrais simplement dériver une classe abstraite ayant un constructeur comportant un paramètre.  Voici mon programme  <div style="border: 1pt d class [ par 24 ans ] salut tout le monde j'utilise VS 2005j' ai ajouter un projet de type class librairie à ma solution pour définir une DLL .qui contient une class "IMPRE Problème POO et héritage [ par fregolo52 ] bonjour,Le novice en POOa besoin d'aide voici mon code :public class Device{  public void Update();}public class Camera : Device{   public voi


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.