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>
{
}
Ajouté le contrôleur avec la ligne où il donne l'erreur. –
@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
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. –