2017-09-11 1 views
-1

Cela semble définitivement être un problème différent de celui du Multithreading issue. Utilisation de l'unité avec injection de dépendances (DI) pour tous mes services et utilisation d'un contexte de structure d'entité qui semble être initialisé et fonctionner correctement.Lors de l'utilisation de Unity DI, comment ajouter un service Non DI avec Entity Framework

Utilise actuellement .net 4.5 avec mvc et Unity.WebApi et framework d'infrastructure 6.0.0.0.

Je veux savoir s'il est possible de conserver un service dans ce modèle ou de l'utiliser en dehors de DI et de pouvoir fermer et réinitialiser l'infrastructure d'entité dans le service persistant si possible.

Je reçois actuellement cette erreur lorsque j'essaie de maintenir un service dans une classe de pile pour que ses performances soient très rapides car je l'utilise plus fréquemment.

The Error message I am getting is: Error Message: The underlying provider failed on Open. - The connection was not closed. The connection's current state is connecting.( at System.Data.Entity.Core.EntityClient.EntityConnection.Open() 

Le but est de récupérer une seule entité et faire charge très rapide par rapport à la dépendance version à injection et exposer les résultats grâce à un service. L'entité est liée à une table SQL à des fins de consignation.

Voici l'extrait de code des raisons pour lesquelles je suis en train de faire persister le service:

using System; 
using System.Linq; 

using Davinci.Models; 

namespace Services.Services 
{ 
    public interface ILogService 
    { 
     void SaveLog(UserLog log); 
     UserLog RetreiveLog(DateTime dateTime); 
    } 

public class LogService : ILogService 
{ 
    private DavinciEntities _DavinciEntities; 

    public LogService(DavinciEntities context) 
    { 
     _DavinciEntities = context; 
    } 

    private void SaveLog(UserLog log) 
    { 
     _DavinciEntities.UserLogs.Add(log); 
     _DavinciEntities.SaveChanges(); 
    } 

    public UserLog RetreiveLog(DateTime dateTime) 
    { 
     return _DavinciEntities.UserLogs.Where(m => m.LogTime.ToShortDateString() == dateTime.ToShortDateString()).FirstOrDefault(); 
    } 
} 

public static class PersistService 
{ 
    public static UserLogService userLogService {get; set;} 
    public static void PersistUserLog(UserLogService service) 
    { 
     IUserLogService UserLogService; 
     if (UserAccessLog == null) 
     { 
      UserLogService = (UserLogService)context.Configuration.DependencyResolver.GetService(typeof(UserLogService)); 
     } 
    } 
} 

}

+1

Pouvez-vous poster des extraits de code? – ovation22

+0

Copie possible de [Multithreading Entity Framework: La connexion n'a pas été fermée. L'état actuel de la connexion est en cours de connexion] (https://stackoverflow.com/questions/12521695/multithreading-entity-framework-the-connection-was-not-closed-the-connections) – CodeCaster

+0

Afficher le code _minimal_ requis pour reproduire le problème , comme expliqué dans [mcve]. Aussi, partagez votre recherche comme expliqué dans [demander]. Cette erreur concerne la réutilisation d'une ancienne instance DbContext dont la connexion a été fermée, en ne l'éliminant pas correctement et/ou en lui attribuant une durée de vie incorrecte dans votre conteneur DI. Montrez comment vous configurez et utilisez ces classes. – CodeCaster

Répondre

0

Depuis que je l'avais enregistré une copie de mon service avec DBContext de mon entité, il a échoué parce qu'elle était utilisé par plusieurs threads. Le correctif consistait à le réécrire à chaque fois car il provenait à l'origine d'une méthode de résolveur Unity DI et l'entité n'était pas renouvelée chaque fois que le service stocké et ses méthodes étaient appelés. Son inconnue si le contexte actuel peut être effacé d'une manière différente ou meilleure pour le rendre plus rapide lorsque vous avez terminé avec un scénario d'utilisation spécifique dans un thread ou un point d'extrémité de site web spécifique au lieu de l'ajouter à chaque appel de méthode du service enregistré.

Solution à chaque fois que son stocké dans une variable statique et réutilisée sur chaque méthode:

// some service 
public class SomeSerivce : ISomeService 
{ 
... 
    // when the service is stored must use new context liberally 
    public void SomeStaticMethod() { 
     _DavinciEntities = new DavinciEntities(); 
    ... // work 
    } 
} 

Un exemple de cas où cela pourrait être nécessaire serait filtre ou filtre global.