gpt4 book ai didi

c# - 在多层应用程序的 DbContext 上使用 Ninject

转载 作者:太空宇宙 更新时间:2023-11-03 11:10:42 24 4
gpt4 key购买 nike

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

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

该接口(interface)的实现如下所示。

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、一个 Item 对象和一个类 (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 is disposed”运行时错误。我试图让事情变得简单,只是为了掌握框架,但不明白如何使 DbContext 范围正确。我已经看过这里的其他文章,但所有文章都是针对特定场景的,我想掌握正确的基础知识。

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

最佳答案

您得到 “DbContext is disposed” 因为您在将 GetAll 方法留在 ItemRepository 上并且查询是尚未执行。当 ToList() 被调用时,查询在 GetItems 方法内执行 - 由于 using,此时您的数据上下文已经被释放关闭。如果您想将 Items 作为 IQueryable 返回,您必须让数据上下文保持事件状态,直到您完成查询。

我建议将您的 GenericsEntities 绑定(bind)到 Web 应用程序的请求范围内(ninject 会根据请求为您处理它),或者如果它是桌面应用程序则绑定(bind)到某些自定义范围内并注入(inject)到您的存储库。

注册

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

关于c# - 在多层应用程序的 DbContext 上使用 Ninject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14160534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com