2010-07-19 4 views
1

J'ai fait quelques recherches mais je n'ai pas réussi à comprendre comment lier les contextes de données LinqToSql avec des chaînes de connexion spécifiées dans différents référentiels.Comment configurer Ninject pour ASP.NET MVC en utilisant LinqToSQL et Repository Pattern

Cette liaison est effectuée dans global.ajax lorsque les routes sont enregistrées. J'utilise un modèle de référentiel assez standard pour découpler l'infrastructure LinqToSql de mon application afin de pouvoir changer l'infrastructure technologique dans le futur (NHibernate, EntityFramework etc.). De plus, rendre mon code facilement testable à l'unité et simulable.

J'ai quelque chose comme ça.

string desktopConnectionString = ConfigurationManager.ConnectionStrings["Desktop"].ConnectionString; 
string messagingConnectionString = ConfigurationManager.ConnectionStrings["MessageQueue"].ConnectionString; 
string usersConnectionString = ConfigurationManager.ConnectionStrings["Users"].ConnectionString; 

// Map linqToSql entity types to interfaces 
TableMapper typeFinder = new TableMapper(); 
typeFinder.Define<EzsDashboard>().As<IDashboard>(); 
typeFinder.Define<EzsDashboardGadget>().As<IGadget>(); 
typeFinder.Define<EzsDashboardGadgetAssignment>().As<IGadgetAssignment>(); 
... 

IDesktopRepository dr = new DesktopRepository(new LinqToSqlDataSource(new DataContext(desktopConnectionString), typeFinder))); 
Bind<IDesktopRepository>().ToConstant(dr).InRequestScope(); 

IUserRepository ur = new UserRepository(new LinqToSqlDataSource(new DataContext(usersConnectionString), typeFinder))); 
Bind<IUserRepository>().ToConstant(ur).InRequestScope(); 

IMessageRepository mr = new MessageRepository(new LinqToSqlDataSource(new DataContext(messagingConnectionString), typeFinder))); 
Bind<IMessageRepository>().ToConstant(mr).InRequestScope(); 

Alors que cela fonctionne physiquement. Je trouve les données dans mon application asp.net MVC revient souvent obsolète. Par exemple, je vais ajouter un gadget au tableau de bord qu'il affiche et si je vérifie la base de données, il a été enregistré correctement dans la base de données. Je recharge la page et le tableau de bord ne montre rien. Un clic sur l'application provoque parfois son actualisation et les données enregistrées sont affichées.

Une autre façon de voir cela est si je fais une modification de mon web.config et déclenche une application re-charger. Quand je tape sur le tableau de bord tout se présente exactement comme il se doit.

Quelqu'un peut-il s'il vous plaît fournir de l'aide d'une connexion de liaison string-> DataContext-> LinqToSqlDataSource-> DomainRepository

Répondre

1

Il semble me comme vos dépôts dépassent la portée que vous attendez. Ai-je raison de supposer que le code de votre question se trouve dans un module Ninject ou dans une application globale?Si oui, je changerais chacun de vos fixations à quelque chose comme ceci:

Bind<IDesktopRepository>().ToMethod(context => new DesktopRepository(new LinqToSqlDataSource(new DataContext(desktopConnectionString), typeFinder)))).InRequestScope(); 

Je crois que vous obtenez le même référentiel dans les demandes, parce que vous avez lié à une constante. Je voudrais un nouveau dépôt par demande, que le code ci-dessus fournira.

+0

Parfait. Votre raisonnement derrière le référentiel étant transmis à travers les demandes dues à BindToConstant semble raisonnable. J'avais InRequestScope à la fin de la liaison, mais il ne devait pas fonctionner correctement. Votre solution a supprimé quelques lignes de code supplémentaires et résolu le problème de données obsolètes que j'avais. Merci beaucoup. Btw, oui cela a été fait au début de l'application; –

0

Je tapé cela, mais, à la réflexion, je ne sais pas ce que vous demandez ... Pouvez-vous préciser:

  • à un haut niveau, qu'est-ce que ces chaînes de connexion à réaliser dans votre application
  • ce que vous ressentez va mal dans votre système? Est-ce que vous pensez qu'il s'agit d'un problème ASP.NET ou d'un problème de DI? Êtes-vous cahier des choses dans une session, etc.?

Vous devez faire surface des choses comme cela (en supposant que je l'ai inférée à juste titre que vous voulez dynamiquement être en mesure de changer le mécanisme de stockage de l'application à la volée - vous avez dit ce que vous faites, pas pourquoi vous le faites) en tant que logique d'application.

Essayer d'abuser d'un conteneur DI pour le faire pour vous est une mauvaise nouvelle - il ne conserve pas un arbre d'objets auquel il donne l'ancienne configuration, etc. Votre application doit gérer cela. Pensez au cas où vous passez du stockage de A à B. Que se passe-t-il si quelque chose dans votre application contacte A au milieu de votre opération et est sur le point de réessayer? Vous ne voulez pas que le conteneur (ou quelqu'un d'autre) lui donne un B à la place. Cela ne veut pas dire qu'il n'y a pas de cas d'utilisation légitime pour de telles choses. C'est juste qu'ils ne sont certainement pas un cas commun ou quelque chose que les conteneurs DI sont généralement utilisés pour gérer.

... Ou je peux manquer quelque chose - dans ce cas, il serait intéressant d'en savoir plus sur votre système et comment vous essayez de cartographier les choses aux étendues etc.

+0

J'ai mis à jour la question originale avec un peu plus de contexte. J'ai déjà déclaré que le problème est ce que je crois être retourné des données périmées. Comme je demandais spécifiquement sur les liaisons ninject, c'est là où je crois que le problème soit. –

+0

@Joshua: Blad vous êtes triés. Je vais laisser ma "réponse" ici pour l'exhaustivité (à moins que vous ne pensiez que la planète serait mieux sans le conseil général auquel cas je vais heureusement le supprimer) –

Questions connexes