2

我正在尝试掌握 Ninject,但似乎在这里找不到任何有助于解决我的问题的文章。我创建了一个简单的 n 层解决方案,其中包含 Web、业务逻辑和数据访问层。在 DAL 中,我为我的数据库(简单的两个表 DB)和通用存储库(IRepositoryItemRepository)创建了一个模型,如下所示。

public interface IRepository<T> where T : class
{
    IQueryable<T> GetAll();
} 

这个接口的实现看起来像这样。

public class ItemRepository : IRepository<Item>
{

    public IQueryable<Item> GetAll()
    {
        IQueryable<Item> result;
        using (GenericsEntities DB = new GenericsEntities()) {
            result = DB.Set<Item>();
        }
        return result;
    }

}

在我的 BLL 中,我创建了一个DataModule、一个ItemObject 和一个类 ( DoWork) 来使用它们。这些看起来如下......

public class DataModule : NinjectModule
{
    public override void Load()
    {
        Bind(typeof(IRepository<>)).To<ItemRepository>();
    }

}

项目对象

public class Item
{

    DAL.IRepository<DAL.Item> _repository;

    [Inject]
    public Item(DAL.IRepository<DAL.Item> repository) {
        _repository = repository;
    } 

    public List<DAL.Item> GetItems(){

        List<DAL.Item> result = new List<DAL.Item>();
        result = _repository.GetAll().ToList();
        return result;            

    }

}

DoWork 类

public DoWork()
    {
        var DataKernel = new StandardKernel(new DataModule());            
        var ItemRepository = DataKernel.Get<IRepository<DAL.Item>>();

        Item thisItem = new Item(ItemRepository);
        List<DAL.Item> myList = thisItem.GetItems();
    }

我遇到的问题是,当我从 Web 项目中使用此代码时,我得到一个“DbContext 已处理”运行时错误。我试图让事情变得简单,只是为了掌握框架,但不明白如何让DbContext范围正确。我已经查看了这里的其他文章,但所有文章都针对某些场景,我想掌握正确的基础知识。

任何人都可以帮助或指出我正确的方向吗?

4

1 回答 1

2

您得到“DbContext 已处置”,因为您在将GetAll方法留在您的方法之前处置它ItemRepository并且查询尚未执行。GetItems当调用 时,查询在方法内部执行ToList()- 那时您的数据上下文已经因为该using闭包而被释放。如果您想返回ItemsIQueryable则必须让数据上下文处于活动状态,直到您完成查询。

我建议将您GenericsEntities的请求范围内(ninject 将在请求范围内为您处理)为 Web 应用程序或在某些自定义范围内(如果它是桌面应用程序)并注入您的存储库。

登记

Bind<GenericEntities>().ToSelf().InRequestScope();

存储库

public class ItemRepository : IRepository<Item>
{
    private readonly GenericEntities DB;

    public ItemRepository(GenericEntities db)
    {
         this.DB = db;                            
    } 

    public IQueryable<Item> GetAll()
    {
        return DB.Set<Item>();
    }   
}
于 2013-01-04T16:38:16.250 回答