2010-06-28 9 views
0

Étant donné un projet (en cours) qui implémente une architecture à deux niveaux avec une couche de gestion sur-couche bien séparée, suivant le generic DAO architecture as pioneered by Bill McCafferty on CodeProject typique et expliqué brièvement au chapitre 10 de NHibernate in Action.Quelles sont les approches recommandées pour migrer de NHibernate à deux niveaux à trois niveaux avec SOA (Microsoft CRM)?

Ce projet doit être déplacé pour effectuer les opérations CRUD et la logique métier via Microsoft CRM en tant que niveau intermédiaire à l'aide de services Web. Les objets et méthodes personnalisés sont définis dans le CRM pour imiter la situation actuelle.

Je ne pense pas que ce soit une bonne idée de commencer à déplacer le POCO d'avant en arrière de la même manière que nous avions l'habitude de faire. En outre, les fonctionnalités de chargement différé, de mise en cache et de concurrence doivent toutes être traitées différemment. Considérant que nous devons minimiser les appels entre couche intermédiaire et couche de présentation apporter un autre défi.

La mise en œuvre de DTO semble la bonne cause d'action, mais nécessite un long chemin (plus un chemin d'apprentissage pour l'équipe). J'ai déjà réalisé des projets SOA, mais maintenant je cherche le chemin de moindre résistance. Pouvons-nous continuer à utiliser NHibernate, même si la connexion directe à la base de données ne sera pas une option? Devrons-nous repenser la conception, ou les entités déconnectées, introduites dans .NET 4.0 peut-être une option? Comment peut-il devenir indolore?

+0

comment pouvez-vous utiliser NHibernate quand aucun accès direct à DB est possible? –

+0

@afsharm, eh bien, c'est la question ici. NH travaille avec des connecteurs et techniquement, vous devriez pouvoir brancher un traducteur pour HSQL à FetchXML. Considérant XRM (comme mentionné par Josh) est une couche utilisant ADO.NET, il pourrait être possible de combiner les deux. Que ce soit aussi faisable est une autre question. – Abel

Répondre

1

Nous utilisons XRMLinq - http://www.xrmlinq.com. Il construit vos objets DTO et vous pouvez ensuite utiliser la syntaxe LINQ pour lancer une requête contre eux. Le framework convertit automatiquement vos requêtes LINQ en requêtes FetchXML par rapport aux services Web CRM. Les objets DTO sont créés en tant que classes partielles, vous pouvez donc ajouter votre propre logique qui survivra aux régénérations.

Autre astuce: utilisez des activités de workflow personnalisées pour votre logique métier lorsque cela est possible. Au lieu d'écrire la logique directement dans le DTO généré par XRMLinq, envisagez de créer une activité de workflow personnalisée qui se déclenchera lorsque certains champs seront mis à jour. Cela force votre logique métier à s'exécuter même si ces champs sont mis à jour ailleurs dans le système (et non via votre logique DTO personnalisée). Il vous offre également un système de mise en file d'attente et un mécanisme de rétablissement efficaces - si votre activité de flux de travail personnalisé déclenche une exception, le workflow est "suspendu" jusqu'à ce que vous résolviez le problème, auquel cas vous pouvez reprendre les workflows échoués. Cela ne fonctionne que pour la logique métier qui peut être exécutée de manière asynchrone, mais pour la logique synchrone, je recommanderais quand même d'examiner les plugins personnalisés avant d'écrire la logique dans le DTO.

Espérons que ça aide!

+1

Cela aide définitivement! Je dois regarder dans les idées de flux de travail personnalisé, mais cela ressemble à quelque chose que nous étions de toute façon. La conversion est encore à ses débuts, la seule chose sûre est le résultat: toutes les données de et vers CRM. – Abel

+0

Bonne chance - nous utilisons MSCRM 4 comme cadre d'entreprise et nous l'adorons.Cela vous fait certainement repenser votre architecture existante, mais cela en valait vraiment la peine pour nous. En fait, je passe ma journée à écrire de la logique métier au lieu de la plomberie maintenant - le Saint Graal! :) –

2

Jetez un coup d'œil à MS CRM SDK 4.0.12, dans Reflector aussi. Ils ont fait un bon bout de chemin vers un ORM approprié, y compris CRUD et Linq. Il y a beaucoup de différences subtiles (et pas si subtiles) avec NH là-bas, et il n'est pas encore formé au plugin, mais au moins vous pouvez emprunter quelques idées.

+0

Belles suggestions, merci! – Abel