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

Framework .NET Discussion :

[Arch#] Architecture, IoC, AOP, Linq et co


Sujet :

Framework .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut [Arch#] Architecture, IoC, AOP, Linq et co
    Bonjour !

    Je lance un projet personnel de Framework applicatif, son nom : Arch#

    Il s'agit, pour faire court, d'un Framework aidant la création d'application multicouche.

    Ca pourrait intéresser ceux qui aime la mise en place d'architecture orienté DDD, EF, l'IoC, la POA ou tout simplement des débutants en architecture.

    Un exemple d'objet business utilisant des fonctionnalités du framework :

    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
    20
    21
    22
    23
    [Order("Title")]
    [Includes("Category")]
    public class Todo : Entity<int>
    {
        [Required]
        [StringLength(50)]
        public virtual string Title { get; set; }
     
        [Required]
        [StringLength(1000)]
        public virtual string Description { get; set; }
     
        [Increment]
        public int Version { get; set; }
     
        [AutoNowCreate]
        public virtual DateTime CreationDate { get; set; }
     
        [AutoNow]
        public virtual DateTime UpdateDate { get; set; }
     
        public virtual Category Category { get; set; }
    }
    Je vous laisse deviner a quoi servent les Tags

    En théorie ces technologies sont indépendantes d'EF et des provider NHibernate et mongoDB vont venir.

    Si vous avez envie d'en savoir plus, le projet est ici : http://arch.codeplex.com/ une release avec code source et un petit exemple de développement avec MVC 2 est disponible.

    Attention : C#4 et VS 2010 requis

    Si vous avez des commentaires ou des idées je suis preneur

    A+

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Moi j'aime bien, du code clean, simple et utile.
    Si tu veux un coup de main ?

  3. #3
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Bonjour BAf!

    Merci pour ton retour sympathique, je suis content que ça plaise

    Vis à vis d'un coup de main pourquoi pas, il faut voir sous quel forme ?

    Déjà quelques conseils de personnes ayant fait pas mal de boulot d'architecture m'intéresse beaucoup !

    Par exemple pour le moment je réfléchis à comment refaire le mécanisme d'interception, je trouve que l'api n'est pas assez bien fait.

    Au début c'était plus clean mais il y avait une dépendance forte entre les objets business de l'application utilisant le framework et la DLL Arch.
    Ça me gène de partager toute la dll Arch - par exemple - dans un contexte d'application client/serveur partageant le même model objet.
    Le problème c'est un peu ça : les objets business ont besoin de connaitre les aspects (Order, Includes, AutoNow, ...) mais ces derniers font pas mal de business et c'est difficile de les découpler d'Arch.
    Pour le moment les aspects "Order" et "Includes" se contentent de copier les paramètres (via reflection) dans le repository qui gèrent lui même le comportement résultant de ces aspects.
    Donc si tu as des idées d'amélioration en gardant un découplage fort ...

    Après je compte créer de nouveaux intercepteurs, notamment pour la validation (avant create et update) utilisant les DataAnnotations et peut être aussi les ValidationAspect
    Si quelqu'un as des idées d'autre types d'interception qui pourraient être intéressant je suis prêt à me pencher dessus

    Sinon j'ai mis le projet en Alpha pas d'un point de vue où il n'est pas exploitable (j'ai déjà utilisé des mécanismes proches dans des projets réels) mais dans le sens où je compte y ajouter quelques blocs et que l'API risque de bouger encore un peu. Se mettre en mode 1.0 fait perdre de la flexibilité dans les possibilités de modifier le projet et je préfère attendre d'avoir eu quelques retours.

  4. #4
    Membre Expert Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Par défaut
    Tu fais un usage intensif de la reflection, non ?

    Pour ce qui est de ton mécanisme d'interception, j'ai un projet perso en ce moment qui pourrait te donner quelques pistes intéressantes, et par là même te permettre de te débarrasser de la dépendance à la classe Entity<T>.

    Par contre, j'hésite un peu entre diverses architectures pour gérer les types génériques, dans mon projet.

  5. #5
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    En effet il y a un peu trop de reflexion à mon gout.

    Par exemple le autonow execute cela à chaque update :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void Intercept<T>(T entity, MemberInfo member)
    {
        (member as PropertyInfo).GetSetMethod().Invoke(entity, new object[] { DateTime.Now });
    }
    On pourrait mettre en cache le GetSetMethod ... Sinon (juste) le invoke à partir d'une méthode récupéré via réflexion est plus long qu'un appel standard ?

    Ma classe entity n'est pas obligatoire dans mon framework, elle donne juste un "coup de main" sur les GetHashCode, Equals et une propriété "IsTransient".

    J'ai réglé mon problème de WCF avec les entity<T> mais si tu as quelque chose d'intéressant pour s'en "débarrasser" je suis pas contre

  6. #6
    Membre Expert Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Par défaut
    L'invoke tout court sera plus lent qu'un appel direct, sans reflexion, oui.

    Tu peux t'en passer de diverses manières, en fait.
    Avec une lambda expression, une méthode dynamique, un proxy dynamique ou carrément en injectant du code dans la méthode interceptée.

    Le proxy va t'obliger à te passer d'une instanciation simple avec l'opérateur new.
    L'injection de code, ça dépend comment tu t'y prend.

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par anthyme Voir le message
    En effet il y a un peu trop de reflexion à mon gout.

    Par exemple le autonow execute cela à chaque update :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void Intercept<T>(T entity, MemberInfo member)
    {
        (member as PropertyInfo).GetSetMethod().Invoke(entity, new object[] { DateTime.Now });
    }
    On pourrait mettre en cache le GetSetMethod ... Sinon (juste) le invoke à partir d'une méthode récupéré via réflexion est plus long qu'un appel standard ?
    Oui sensiblement. Le mieux dans ce cas est de procéder par injection de code : on utilise la Reflection la première fois, pour déterminer le code à injecter puis on injecte le code (avec "Emit") et ensuite on a des perf normales.

Discussions similaires

  1. cherche tuto spring sans blabla sur ioc aop
    Par pschiit dans le forum Spring
    Réponses: 0
    Dernier message: 18/05/2011, 14h29
  2. Architecture XML / requete LINQ
    Par bidault dans le forum Linq
    Réponses: 1
    Dernier message: 06/03/2011, 15h53
  3. [AOP et IOC] Solution en .net
    Par anthyme dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 17/07/2007, 15h04
  4. [Architecture] Questions DB, Arch, Tech pour un project
    Par Ultiny dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 02/05/2006, 15h04

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