gpt4 book ai didi

asp.net-mvc-4 - 依赖注入(inject) - 即将调用 EF 存储库 Dispose 方法

转载 作者:行者123 更新时间:2023-12-01 19:50:19 25 4
gpt4 key购买 nike

我有一个 MVC4 Web 项目,并使用 CaSTLe Windsor 作为我的 DI 容器。另外,我正在使用 Entity Framework 来访问 SQL 数据库。我想将我的 Lifestyle 设置为 PerWebRequest,但是,当我这样做时,我收到以下错误:“操作无法完成,因为 DbContext 已被释放”。

如果我使用 transient 生活方式,则会绕过该错误,但它会引入 Entity Framework 的一系列新问题。如何保持 PerWebRequest 生活方式,但在调用 dispose 方法时保持正确?

我正在使用构造函数注入(inject)向我的存储库传递连接字符串以构建新的上下文。我还实现了 IDisposable。见下文:

public class MySqlRepository : MyRepository, IDisposable
{
private readonly DbContext _context;

public MySqlRepository(string connectionString)
{
_context = new DbContext(connectionString);
}

protected virtual void Dispose(bool disposing)
{
if (disposing)
{
_context.Dispose();
}
}

public void Dispose()
{
Dispose(true);
}
}

最佳答案

这应该不是问题。我曾经遇到过这个问题,原因是我的容器设置不正确。

这是一个使用温莎城堡的演示。

容器的设置如下:

container = new WindsorContainer();
container.Register(Classes.FromThisAssembly().BasedOn<Controller>().LifestylePerWebRequest());
container.Register(Classes.FromThisAssembly().InNamespace("MvcIoCDemo.Models").WithServiceDefaultInterfaces().LifestylePerWebRequest());

Controller :

public class ProductsController : Controller
{
private readonly IProductRepository productRepository;

public ProductsController(IProductRepository productRepository)
{
if (productRepository == null) throw new ArgumentNullException("productRepository");
this.productRepository = productRepository;
}

存储库:

public class ProductRepository : IDisposable, IProductRepository
{
private readonly DemoDbContext context;

public ProductRepository()
{
context = new DemoDbContext();
}

在此处查看演示项目: https://github.com/kobbikobb/MvcIoCDemo

关于asp.net-mvc-4 - 依赖注入(inject) - 即将调用 EF 存储库 Dispose 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17367322/

25 4 0