1

ASP.NET MVC 3の電子商取引Webサイトを作成していますが、現在管理者エリアを追加/製品を編集する。製品ページのUIを作成するために、私はTelerik MVCコントロールを使用しています。TabStripの複数のtelerik MVCグリッドが、ninjectおよびエンティティフレームワーク、作業単位、リポジトリパターンと連携していません

私の問題は、私は両方のAJAX呼び出しを介してデータベースからデータを取得二telerikグリッドを追加したとき、私は、下記のカップル別のエラーを受け取ることです:

{"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(); 
    } 
} 

ジェネリックリポジトリコード

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でなければなりません。