Компоненты контейнера Windsor недоступны при первом действии контроллера - PullRequest
1 голос
/ 17 сентября 2010

Я использую конфигурацию в global.asax.cs для регистрации компонентов, но похоже, что контейнер еще не был инициализирован при первом запросе http (HomeController> Index action), и он дает мне «ObjectContextэкземпляр был удален и больше не может использоваться для операций, требующих подключения. "ошибка.

Я не могу найти решение для этого и сводит меня с ума!

Выдержка из моего 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...]
}

Контроллер, в котором генерируется исключение при первом запросе 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);
    }

}

Репозиторий / интерфейсы:

Общий интерфейс:

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

Универсальный репозиторий:

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;
    }
}

Интерфейсный курс на основе универсального репозитория:

public interface ICourseRepository : IRepository<Course>
{
}

Ответы [ 2 ]

0 голосов
/ 23 сентября 2010

Я нашел способ справиться с этим хотя бы на мгновение. Поскольку проблема возникает при первом запросе, я просто добавил еще одно действие в свой контроллер и перенаправил на него действие индекса. Возможно, это не лучшее решение, но я не могу уделять больше времени этому вопросу!

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 голосов
/ 17 сентября 2010

если вы используете шаблон единицы работы, вы решите свою проблему

Проверьте этот пост Шаблон единицы работы , очень полезен

...