1

Я создаю веб-сайт электронной коммерции ASP.NET MVC 3, и сейчас я работаю над областью администратора, где вы можете добавлять/редактировать продукты. Чтобы создать пользовательский интерфейс для страницы продукта, я использую элементы управления Telerik MVC.Множественные сетки MVC telerik в TabStrip не работают с инфраструктурой ninject и entity, единицей работы, шаблоном репозитория

Моя проблема заключается в том, что, когда я добавил вторую Telerik сетку, которая и извлечения данных из базы данных с помощью вызова AJAX я получаю несколько различных ошибок, перечисленных ниже:

{"There is already an open DataReader associated with this Command which must be closed first."}

{"The connection was not closed. The connection's current state is connecting."}

Контекст базы данных Код

public interface IUnitOfWork 
{ 
    void Commit(); 
} 

public class GSPDataContext : DbContext, IUnitOfWork 
{ 
    /* (omitted) IDbSet's for entities */ 
    public GSPDataContext() 
     : base("GSPConnectionString") 
    { 

    } 

    public virtual IDbSet<T> DbSet<T>() where T : class 
    { 
     return Set<T>(); 
    } 

    public virtual void Commit() 
    { 
     base.SaveChanges(); 
    } 
} 

Generic Repository Код

public class Repository<T> : IRepository<T> where T : class 
{ 
    private GSPDataContext m_dataContext; 
    private readonly IDbSet<T> m_entity; 

    public Repository(GSPDataContext dataContext) 
    { 
     if (dataContext == null) 
      throw new ArgumentException(); 

     m_dataContext = dataContext; 

     m_entity = m_dataContext.Set<T>(); 
    } 

    public T GetById(int id) 
    { 
     return this.m_entity.Find(id); 
    } 

    public void Insert(T entity) 
    { 
     if (entity == null) 
      throw new ArgumentException(); 

     this.m_entity.Add(entity); 

     //this.m_dataContext.SaveChanges(); 
    } 

    public void Delete(T entity) 
    { 
     if (entity == null) 
      throw new ArgumentException(); 

     this.m_entity.Remove(entity); 

     //this.m_dataContext.SaveChanges(); 
    } 

    public virtual IQueryable<T> Table 
    { 
     get 
     { 
      return this.m_entity; 
     } 
    } 
} 

Ninject Код

private static void RegisterServices(IKernel kernel) 
    { 
     //Customer 
     kernel.Bind<IAddressValidationService>().To<AddressValidationService>().InRequestScope(); 
     kernel.Bind<ICustomerService>().To<CustomerService>().InRequestScope(); 
     kernel.Bind<ICustomerProductService>().To<CustomerProductService>().InRequestScope(); 

     //Authentication 
     kernel.Bind<IOpenIDLoginService>().To<OpenIDLoginService>().InRequestScope(); 
     kernel.Bind<IAuthenticationService>().To<FormsAuthenticationService>().InRequestScope(); 

     //Products 
     kernel.Bind<IProductService>().To<ProductService>().InRequestScope(); 
     kernel.Bind<IRecentlyViewedProductService>().To<RecentlyViewedProductService>().InRequestScope(); 
     kernel.Bind<IProductPictureService>().To<ProductPictureService>().InRequestScope(); 
     kernel.Bind<ICategoryService>().To<CategoryService>().InRequestScope(); 
     kernel.Bind<IPictureService>().To<PictureService>().InRequestScope(); 

     //Shopping Cart 
     kernel.Bind<IShoppingCartService>().To<ShoppingCartService>().InRequestScope(); 

     //Shipping and Payment 
     kernel.Bind<IShippingService>().To<ShippingService>().InRequestScope(); 
     kernel.Bind<IPaymentService>().To<PaymentService>().InRequestScope(); 

     //Orders 
     kernel.Bind<IOrderCalculationService>().To<OrderCalculationService>().InRequestScope(); 
     kernel.Bind<IOrderProcessingService>().To<OrderProcessingService>().InRequestScope(); 
     kernel.Bind<IOrderService>().To<OrderService>().InRequestScope(); 

     // 
     kernel.Bind<IEncryptionService>().To<EncryptionService>().InRequestScope(); 
     kernel.Bind<ILogger>().To<LoggingService>().InRequestScope(); 
     kernel.Bind<IWebManager>().To<WebManager>().InRequestScope(); 

     //Messages 
     kernel.Bind<IEmailService>().To<EmailService>().InRequestScope(); 
     kernel.Bind<IMessageTemplateService>().To<MessageTemplateService>().InRequestScope(); 
     kernel.Bind<IWorkflowMessageService>().To<WorkflowMessageService>().InRequestScope(); 

     //Data 
     kernel.Bind<GSPDataContext>().ToSelf().InSingletonScope(); 
     kernel.Bind<IUnitOfWork>().ToMethod(ctx => ctx.Kernel.Get<GSPDataContext>()).InSingletonScope(); 
     kernel.Bind(typeof (IRepository<>)).To(typeof (Repository<>)).InRequestScope(); 

     kernel.Bind<IWorkContext>().To<WebWorkContext>().InRequestScope(); 
    } 

Я подозреваю, что это что-то делать с тем, как Ninject управляет Времена жизни различных служб, но я не уверен, что мне нужно сделать, чтобы заставить его работать.

Любой совет будет очень благодарен.

Благодаря

UPDATE

Согласно комментарий Ремо я изменить свой код на следующее:

//Data 
    kernel.Bind<GSPDataContext>().ToSelf().InRequestScope(); 
    kernel.Bind<IUnitOfWork>().ToMethod(ctx => ctx.Kernel.Get<GSPDataContext>()).InRequestScope(); 
    kernel.Bind(typeof (IRepository<>)).To(typeof (Repository<>)).InRequestScope(); 

И теперь я получаю следующее сообщение об ошибке:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

Любые идеи?

ответ

1

Нет, это не имеет никакого отношения к тому, как Ninject управляет жизнями. Но он должен делать то, как вы настроили жизненные циклы.

Важно, чтобы для каждого запроса использовался новый DbContext. Это должно быть InRequestScope.

 Смежные вопросы

  • Нет связанных вопросов^_^