gpt4 book ai didi

c# - DbContext 全局范围与方法级范围

转载 作者:太空宇宙 更新时间:2023-11-03 23:11:50 25 4
gpt4 key购买 nike

如果有一个类作为数据访问层,并为实体提供 CRUD 操作的功能,在考虑性能和多线程环境(即此类的方法被多个线程调用)时,哪个版本是最佳实践同时地 。 。)。 . .

版本 1:

在类级别创建的 DbContext,由所有方法共享。 .

    class EmployeeService{

private DbContext db=new DbContext();

public Employee GetEmployee(int id)

return db.Employees.Find(id);
}


public void AddEmployee(Employee employee){

db.Employees.Add(employee);
db.SaveChanges();
}
}

版本 2:

每个方法调用的 DbContext。 .

class EmployeeService{

public Employee GetEmployee(int id){
using(DbContext db=new DbContext()){
return db.Employees.Find(id);
}
}


public void AddEmployee(Employee employee){
using(DbContext db=new DbContext()){
db.Employees.Add(employee);
db.SaveChanges();
}
}
}

更新:可能是发布的问题范围过于笼统,导致需要考虑几点。

兴趣点是,实例化 DbContext 对象的成本。它可以按请求创建(版本 2)还是重量级对象,最好创建几个实例并在不同的实例之间共享它们调用(版本 1)

最佳答案

甚至还有基于手动或自动的第三种方法 dependency injection :

public interface ISomeService 
{
// Interface members
}

public class SomeService : ISomeService
{
public SomeService(DbContext dbContext)
{
DbContext = dbContext;
}

private DbContext DbContext { get; }
}

然后,SomeService 将不负责定义注入(inject) DbContext 的生命周期,而是一个外部类来定义

这样一来,您的服务就专注于做该做的事(处理域和读/写数据)。

根据执行环境,您需要不同的 DbContext 生活方式:每个服务实例、每个请求、每个线程……这里有很多选择,具体取决于情况.

也许您没有考虑另一种情况:两个或多个服务之间的共享事务。您需要将实例化 DbContext 的责任转移到上层,然后您将相同的 DbContext 注入(inject)所有参与服务,您将确认或放弃整个交易全局。

关于c# - DbContext 全局范围与方法级范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38932558/

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