1

J'utilise une configuration dans le fichier global.asax.cs pour enregistrer les composants, mais il semble que le conteneur n'ait pas encore été initialisé lors de la première requête http (HomeController> Action d'index) et il me donne un "L'ObjectContext instance a été éliminé et ne peut plus être utilisé pour les opérations qui nécessitent une connexion." Erreur.Composants de conteneur Windsor non disponibles lors de la première action du contrôleur

Je ne trouve pas de solution pour cela et me rend fou!

Extrait de mes Global.asax.cs:

protected void Application_Start() 
{ 
    InitializeContainer(); 
    InitializeDatabase(); 
    RegisterRoutes(RouteTable.Routes); 
} 

private void InitializeContainer() 
{ 
    _container = new WindsorContainer(); 

    ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(_container)); 

    // Register context manager. 
    _container.Register(
     Component.For<IContextManager>() 
     .ImplementedBy<CoursesContextManager>() 
     .LifeStyle.Singleton 
     .Parameters(
    Parameter.ForKey("connectionString").Eq(ConfigurationManager.ConnectionStrings["CoursesConnection"].ConnectionString) 
     ) 
    ); 
    // Register specifc repository implementations (can we do this more generic?) 
    _container.Register(
     Component.For<ICourseRepository>() 
     .ImplementedBy<CourseRepository>() 
     .LifeStyle.Singleton 
    ); 

    [...other interfaces and controllers registered...] 
} 

Controller où l'exception est levée à la première demande http:

public class HomeController : Controller 
{ 
    private ICourseRepository _courseRepository; 

    public HomeController(ICourseRepository courseRepository) 
    { 
     _courseRepository = courseRepository; 
    } 

    public ActionResult Index() 
    { 
     var courses = _courseRepository.Find(); //here is where it fails 
     return View(courses); 
    } 

} 

référentiel/interfaces:

Interface générique:

public interface IRepository<T> 
{ 
    IQueryable<T> Find(); 
} 

dépôt générique:

public class MyRepository<T> : IRepository<T> where T : class 
{ 
    private IContextManager _contextManager; 
    private string _qualifiedEntitySetName; 
    private string _keyName; 

    protected ObjectContext CurrentObjectContext 
    { 
     get { return _contextManager.GetContext(); } 
    } 

    protected ObjectSet<T> ObjectSet 
    { 
     get { return CurrentObjectContext.CreateObjectSet<T>(); } 
    } 

    public MyRepository(IContextManager contextManager) 
    { 
     this._contextManager = contextManager; 
     this._qualifiedEntitySetName = string.Format("{0}.{1}" 
      , this.ObjectSet.EntitySet.EntityContainer.Name 
      , this.ObjectSet.EntitySet.Name); 
     this._keyName = this.ObjectSet.EntitySet.ElementType.KeyMembers.Single().Name; 
    } 

    public IQueryable<T> Find() 
    { 
     return ObjectSet; 
    } 
} 

cours Interface basé sur référentiel générique:

public interface ICourseRepository : IRepository<Course> 
{ 
} 
+0

Ajouté le contrôleur avec la ligne où il donne l'erreur. –

+1

@tricate - Pouvez-vous ajouter le code de la méthode Find du référentiel? Je ne pense toujours pas que c'est un problème IoC. – GenericTypeTea

+0

oui, désolé mais j'essaie de simplifier la question. Ignorer les 3 meilleurs cours ... le code que j'ai posté retournerait tous les cours et il donne la même erreur. –

Répondre

0

J'ai trouvé un moyen de gérer avec cela au moins momentanément. Comme le problème survient lors de la première requête, je viens d'ajouter une autre action dans mon contrôleur et de rediriger l'action d'index. Probablement pas la meilleure solution mais ne peut pas passer plus de temps sur ce problème!

public class HomeController : Controller 
{ 
    private ICourseRepository _courseRepository; 

    public HomeController(ICourseRepository courseRepository) 
    { 
     _courseRepository = courseRepository; 
    } 

    public ActionResult Index() // Default action in the controller, first hit 
    { 
     return RedirectToAction("Home"); 
    } 

    public ActionResult Home() //The repository is available here, no exception thrown 
    { 
     var courses = _courseRepository.Find(); //here is where it fails 
     return View(courses); 
    } 

} 
0

si vous utilisez l'unité de modèle de travail vous permettra de résoudre votre problème

Vérifiez ce poste Unit Of Work Pattern, est très utile

+1

merci pour la suggestion ... J'essaie de résoudre ce problème pas trouver de nouveaux;) –