2013-05-07 5 views
1

J'ai vraiment lutté avec le titre sur celui-ci alors j'espère que je vais décrire beaucoup mieux ici!Ninject singleton et Entity Framework avec MVC et API

Nous utilisons Entity Framework comme ORM et Ninject comme infrastructure d'injection de dépendances. Nous relions notre DbFactory et UnitOfWork comme un singleton avec Ninject

Bind<IDbFactory>().To<DbFactory>().InSingletonScope(); 
Bind<IUnitOfWork>().To<UnitOfWork>().InSingletonScope(); 

Maintenant, au sein du projet MVC Cela fonctionne très bien, mais nous voulons aussi utiliser une API pour poster des données sur le serveur, puis rafraîchir la page. Il faut environ 10 minutes à EF pour décider qu'il veut interroger à nouveau la base de données pour récupérer les données.

Outre la désactivation de la mise en cache, ma seule théorie est que Ninject crée un objet pour le projet MVC à utiliser et un autre pour l'API. Donc ma question ma théorie est-elle correcte et si oui, comment puis-je surmonter cela?

Edit: modèle Exemple

public class Property 
{ 
    public int Id { get; set; } 
    public virtual ICollection<PropertyPhoto> PropertyPhotos { get; set; } 
    // Blah blah everything else 
} 

public class PropertyPhoto 
{ 
    public int Id { get; set; } 
    // Blah blah everything else 
} 

Maintenant, l'API est mise à jour du modèle PropertyPhoto par son dépôt alors que le projet mvc utilise le modèle Property

+0

Avez-vous débogué le projet. Il y a beaucoup d'endroits où la mise en cache pourrait se produire. Le navigateur, le proxy HTTP, IIS, .net, ASP.NET MVC, et enfin EF. Essayez de tracer l'endroit où se trouvent les demandes. – Aron

+0

Ce n'est pas le navigateur - nous n'utilisons pas de proxy - nous utilisons IIS Express. Je vais éditer ma réponse avec un exemple de modèle. – Matt

+2

"Nous lions notre ... UnitOfWork comme un singleton". Cela pourrait devenir un problème. Une unité de travail n'est par définition pas singleton, mais plutôt par requête ou quelque chose de similaire. S'il vous plaît jeter un oeil à [ce poste connexe] (http://stackoverflow.com/questions/3266295/net-entity-framework-and-transactions/3266481#3266481). – Steven

Répondre

0

Je pris sur les conseils de Steven et a retiré le portée singleton mais cela m'a empêché de supprimer des entités de la base de données, à la fin j'ai utilisé

Bind<IDbFactory>().To<DbFactory>().InThreadScope(); 
Bind<IUnitOfWork>().To<UnitOfWork>().InThreadScope(); 
+1

ThreadScope est juste de déplacer le problème. Vous devez utiliser InRequestScope pour les requêtes d'étendue de requête et avoir terminé tout votre traitement à la fin de votre action. Mais il semble que vous ayez d'autres choses en cours, vous pourriez avoir besoin de se salir avec http://stackoverflow.com/questions/7951914/ninject-inrequestscope-fallback-to-inthreadscope et/ou ttp: //stackoverflow.com/questions/15599325/recherche-pour-un-ninject-scope-that-behaves-like-inrequestscope –

+0

@RubenBartelink - Merci, va regarder dans ce ASAP – Matt