1

Je sais que c'est un peu un cheval mort, mais je ne trouve pas de réponse satisfaisante. Laissez-moi d'abord dire, je ne suis pas avec une application web, sinon la gestion de NH Session est assez simple.NHibernate Session DI de StructureMap dans les composants

J'ai un tas de composants d'entreprise. Ces composants ont leur propre couche de service qui agira sur plusieurs référentiels. Par exemple:

  • Composant revendication
    • Service traitement des demandes
    • revendication dépôt
  • Composante de facturation
    • Service de facturation
    • facturation Repository
  • composante politique
    • de PolicyLockService
    • Politique de dépôt

Maintenant, je peut avoir une console ou application Windows qui a besoin de coordonner une opération qui implique chacun des services. Je veux écrire les services à injecter avec (DI) leurs dépôts requis. Les référentiels devraient avoir une ISession, ou similaire, injectée dans eux afin que je puisse avoir cette opération effectuée sous une ISession/ITransaction.

Je suis au courant du modèle d'unité de travail et des nombreux échantillons, mais aucun d'entre eux n'a montré de DI. Je me méfie aussi de [ThreadStatic] parce que ces trucs peuvent aussi être utilisés à partir de la WCF et j'ai trouvé assez de messages décrivant comment faire ça. J'ai lu sur les conversations d'affaires, mais j'ai besoin de quelque chose de simple que chaque application Windows/console peut facilement démarrer car nous avons beaucoup de ces applications et quelques développeurs assez inexpérimentés.

Alors, comment configurer StructureMap pour injecter la même ISession dans chacun des référentiels dépendants d'une application? Voici un exemple tout à fait artificiel et totalement composé sans utiliser SM (pour plus de précision - s'il vous plaît ne pas dépenser critisizing d'énergie): Je pense que

ConsoleApplication

Main 
{ 

    using(ISession session = GetSession()) 
    using(ITransaction trans = session.BeginTransaction()) 
    { 
    var policyRepo = new PolicyRepo(session); 
    var policyService = new PolicyService(policyRepo); 

    var billingRepo = new BillingRepo(session) 
    var billingService = new BillingService(billingRepo); 

    var claimRepo = new ClaimsRepo(session); 

    var claimService = new ClaimService(claimRepo, policyService, billingService); 

    claimService.FileCLaim(); 

    trans.Commit(); 


    } 

} 
+0

Vous pouvez le faire en utilisant un AsSingleton dans la configuration StructureMap , mais vous ne voulez probablement pas utiliser une session pour l'ensemble des applications. – Paco

+0

Correct, je ne veux pas en utiliser un par application. –

+0

J'ai lu l'article de Jeremy D. Millers sur l'utilisation de NH à Dovetail 100 fois et je pense qu'il y a quelque chose dans les conteneurs imbriqués, mais je ne trouve pas grand-chose pour vous en occuper. –

Répondre

0

J'ai maintenant la pièce du puzzle manquante. Jeremy D. Miller a eu la gentillesse de poster son code pour ITransactionProcessor.

http://codebetter.com/blogs/jeremy.miller/archive/2010/01/06/how-dovetail-uses-structuremap-with-nhibernate.aspx

Cela utilisera les nouveaux StructureMap conteneurs imbriqués à portée ma session à tous mes composants en une seule transaction. Quand je serai en train de travailler, je posterai le code sur mon blog et une mise à jour de ce sujet.

http://blog.coreycoogan.com